Переписывание и цикл Apache - PullRequest
0 голосов
/ 13 мая 2019

настройка перезаписи URL для получения хороших URL-адресов, у меня есть существующие URL-адреса: /xxx/test.php

, но в фоновом режиме он всегда идет к одному и тому же сценарию с запросом: / xxx /index.php? id = test

со следующим переписыванием:

RewriteRule ^xxx/([0-9a-z\-]*)\.php$ /xxx/index\.php?id=$1 [QSA,L]

все работает нормально.

сейчас есть старые URL, которые по-прежнему похожи на / xxx / index.php? id = $ 1, и я хочу избавиться от этих старых URL-адресов, то есть я хочу, чтобы все они были предназначены для пользователей, таких как /xxx/test.php с перенаправлением 301

Я переписал для этогоно тогда я вхожу в цикл несмотря на флаг L

RewriteCond %{QUERY_STRING} ^id=(.*)$ 
RewriteRule ^xxx/index\.php$ /xxx/%1.php? [R=301,L] 

?можно ли справиться с этим и как?

и другие, чтобы описать его, всегда используйте скрипт: /xxx/index.php?id=$1, но всегда в браузере отображается правильный URL

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Сохраните свой существующий

RewriteRule ^xxx/([0-9a-z\-]*)\.php$ /xxx/index\.php?id=$1 [QSA,L]

, который, кажется, работает нормально.

Добавьте эти две строки перед тем, который будет перехватывать, если есть id =, и убрать его из URL.

RewriteCond %{QUERY_STRING} ^id=([^&]*)(.*)$
RewriteRule ^xxx/([0-9a-z\-]*)\.php$ /xxx/index\.php?id=%1%2 [L,R=301]
  • ^ начало строки запроса
  • ([^ &]) * любой символ, кроме &
  • (. *) Любые следующие символы

Так что, если строка запроса id=test&something=else RewriteRule добавит именно это и ничего больше, так как флаг QSA больше не существует.

Попробуйте эти 3 строки вместе ( сайт тестирования htaccess ), вот полный файл htaccess:

RewriteCond %{QUERY_STRING} ^id=([^&]*)(.*)$
RewriteRule ^xxx/([0-9a-z\-]*)\.php$ /xxx/index\.php?id=%1%2 [L]

RewriteRule ^xxx/([0-9a-z\-]*)\.php$ /xxx/index\.php?id=$1 [QSA,L]
0 голосов
/ 13 мая 2019

Сделайте так, чтобы ваш RewriteRule не совпадал с index.php или удалите флаг QSA.

Допустим, вы набираете test.php хорошо, теперь вы перейдете к index.php?id=test

Затем перезапись произойдет снова, и выперейдет к index.php?id=index&id=test

Тогда это произойдет снова, потому что страница отличается: index.php?id=index&id=index&id=test etc.

Поэтому добавьте в свое регулярное выражение отрицательный прогноз: xxx/(?!index)([0-9a-z\-]*)\.php

Попробуйте:

RewriteRule ^xxx/(?!index)([0-9a-z\-]*)\.php$ /xxx/index\.php?id=$1 [QSA,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...