Я пытаюсь скрыть часть URL и показать только переменные, такие как каталоги.
Например: изменить с https://somesite.com/users.php?user=Alex
в https://somesite.com/Alex/
или из https://somesite.com/users.php?user=Alex&tab=photos
в https://somesite.com/Alex/photos/
,
мой .htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# hide GET variables from url for messages page.
RewriteRule ^messages/(.*) messages.php?message=$1 [L,QSA]
# hide users.php and transforming variables in directories.
RewriteRule ^/%1 users.php?user=$1 [L,QSA]
</IfModule>
Но если я получу доступ https://somesite.com/users.php?user=Alex
ничего не происходит, и если я получу доступ https://somesite.com/Alex/
ошибка 404 возвращается.
Используйте этот код для скрипта users.php:
RewriteRule (.*) users.php?user=$1 [L,QSA]
Это правило должно быть после правила сообщений в этом порядке, чтобы работать в обоих случаях.
Пожалуйста, напишите этот код в вашем файле .htaccess
RewriteEngine On # Turn on the rewriting engine
RewriteRule ^([A-Za-z0-9-]+)/?$ users.php?user=$1 [NC,L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ users.php?user=$1&tab=$2 [NC,L]
Кажется, что самое простое решение — отправить каждый запрос к index.php? Q = $ 1 или другому script.php для управления путем:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?q=$1 [QSA,L]
</IfModule>
index.php может проверить оба случая:
<?php
$q = explode('/',$_GET['q']);
$query=$q[0];
if($query=='messages'){
$message = $q[1];
require "messages.php";
}else{
$user = $query;
require "users.php";
}
?>
Я не вижу, как мог последний RewriteRule
делай что хочешь.
Вы можете использовать это вместо:
RewriteRule ^([^/]+)/?$ users.php?user=$1 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ users.php?user=$1&tab=$2 [L,QSA]
Изменить: Вы также можете использовать mod_rewrite, чтобы перенаправить тех, кто использует старый URL-адрес на новый URL-адрес. Это должно работать:
RewriteCond %{QUERY_STRING} ^user=([^&]+)$
RewriteRule ^/users.php$ /%1/ [L,R=301]
RewriteCond %{QUERY_STRING} ^user=([^&]+)&tab=([^&]+)$
RewriteRule ^/users.php$ /%1/%2/ [NC,L,R=301]
Альтернатива; у вы можете прочитать REQUEST_URI
переменную в php (она должна содержать адрес перед перезаписью) и определить, был ли он старым. Если это так, то перенаправьте на новый.