Удалить часть URL-адреса, содержащую параметр

У меня есть этот URL:

https://www.example.it/page.php?user=Pippo

Результат, который у меня должен был быть:

https://www.example.it/Pippo

Я пытаюсь использовать этот код:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^page/(.*)/$ /page.php?user=$1 [L]

Но часть URL-адреса остается, и если я вернусь на другую страницу, меня будут перенаправлять на ту же страницу до тех пор, пока сервер выйдет из строя.

Вы только что изменили пример кода. Но ваша первая версия выглядела правильно, в соответствии с вашими примерами URL-адресов? Кроме того, есть ли у вас какие-либо другие директивы в вашем файле .htaccess? Порядок важен. Если ваши URL-адреса действительно имеют форму /page/<username>/ (как предлагает обновленный код), вам необходимо убедиться, что MultiViews также отключен.

MrWhite 31.08.2018 00:43
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
1
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите преобразовать перенаправить/page.php?user=<username> в /<username>, где <username> - это последовательность символов a-z или A-Z, попробуйте что-то вроде следующего в верхней части файла .htaccess:

Options -MultiViews

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$    
RewriteCond %{QUERY_STRING} ^user=([a-zA-Z]+)
RewriteRule ^page\.php$ /%1? [R=302,L]

Чтобы уточнить, это сделано только для того, чтобы удовлетворить запросы поисковых систем, которые, возможно, уже проиндексировали старый URL или где внешние сайты ссылались на него. URL-адреса в вашем приложении уже ссылаются непосредственно на /<username>.

%1 - это обратная ссылка на захваченную группу в последнем совпавшем CondPattern. Проверка REDIRECT_STATUSпеременная окружения должна гарантировать, что мы проверяем только первоначальный запрос, а не перезаписанный запрос.

Переходите на 301 только после того, как убедитесь, что он работает нормально.

Затем вы можете следовать этому с существующим правилом, которое внутренне перезаписывает запрос обратно в /page.php?user=<username>. Хотя флаг NC в вашей директиве не нужен. Как выполняется проверка существующего файла (и, возможно, каталога?), Если у вас нет файлов без расширения? И вам не нужно экранировать точку в классе символов. Итак, его можно упростить до:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)$ /page.php?user=$1  [L]

Я обновил свой ответ, чтобы отключить MultiViews (с учетом вашего обновленного образца кода).

MrWhite 31.08.2018 00:49

Если я использую первое решение, берет только первые две буквы user. Со вторым продолжаем редирект.

th3g3ntl3man 31.08.2018 00:54

Я действительно представил только одно решение. Эти два фрагмента кода следует использовать вместе. Какой формат принимает имя пользователя? Вышеупомянутое предполагает только буквы, как в вашем примере. Только если имя пользователя содержит не-альфа-символы, потребуется меньше, чем полное имя пользователя. Блок правил не является «перенаправлением», поэтому, если вы видите перенаправление, возможно, вы видите кешированный ответ или, возможно, существует конфликт с существующими директивами?

MrWhite 31.08.2018 01:13

Мне не удалось изменить регулярное выражение! Теперь все работает правильно! Большое спасибо!!

th3g3ntl3man 31.08.2018 01:21

Другие вопросы по теме