Я пытаюсь написать простое правило перезаписи, которое изменится: с
https://example.com/index.php?shortened_url=value
на
https://example.com/value
Чтобы добиться этого, я использую следующее правило перезаписи:
RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]
Но Я получаю сообщение об ошибке:
Запрос превысил лимит в 10 внутренних перенаправлений из-за возможной ошибки конфигурации.
Очевидно, это говорит о том, что где-то есть проблема с зацикливанием, но, насколько я могу судить, мое правило довольно простое и не должно ' не вызывает зацикливание?
RewriteRule ^ ([^ /] *) $ /index.php?shortened_url = $ 1 [L]
Это приведет к циклу перезаписи, поскольку /index.php?сокращенный_url = значение
будет в дальнейшем переписан на /index.php?shortened_url=index.php
(снова и снова).
Один из способов предотвратить этот цикл перезаписи - перезаписывать только при наличии нет строки запроса (при условии, что вы не используете строку запроса для других целей в этом URL). Например:
RewriteCond %{QUERY_STRING) ^$
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]
Или исключить точки из шаблона RewriteRule
. Например:
RewriteRule ^([^/.]*)$ /index.php?shortened_url=$1 [L]
Здесь важно отметить, что флаг L
( last
) не останавливает всю обработку при использовании для каждого каталога .htaccess
файлы. Он просто останавливает текущий раунд обработки. Процесс перезаписи фактически начинается заново, пока URL-адрес не останется неизменным. Вам необходимо предотвратить дальнейшую перезапись перезаписанного URL.
, который изменится:
https://example.com/index.php?shortened_url=value С
по
https://example.com/value
bocian85 определенно прав в отношении вашего описания, поскольку ваш код делает полную противоположность. Ваш код заменяет https://example.com/value
на https://example.com/index.php?shortened_url=value
. (Предположительно, вы уже изменили URL-адреса в своем приложении, чтобы они имели вид https://example.com/value
?)
Однако код выглядит так, как будто он работает правильно, поэтому я думаю, это просто ваше описание. (?) (Любопытно ... люди часто описывают это так, как вы это делали - в обратном порядке - как будто они описывают конечный результат в приложении, а не то, что на самом деле делает директива.)
Прежде всего, вы потеряли аргументы для команды RewriteRule, порядок следующий:
RewriteRule ЧТО ГДЕ [ОПЦИИ]
(ярлык для упрощения - см. Документацию)
Здесь больше о RewriteRule http://httpd.apache.org/docs/current/mod/mod_rewrite.html
А на самом деле ваше правило перезаписывает любое количество косых черт /
на /index.php?shortened_url=$1
, если я не ошибаюсь.
Значит, ваш https://example.com/
также перенаправлен на длинный URL as https://example.com/////////
Вам нужно освежить свои навыки регулярного выражения - попробуйте эту ссылку, чтобы помочь вам https://regexr.com/
И, наконец, правило, которое вы ищете, должно быть примерно таким:
RewriteRule ^ / index.php \? Shortted_url = (. *) $ Https://example.com/$1 [L]