Я пытаюсь написать простое правило перезаписи, которое изменится:
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?shortened_url=value
будет переписан на /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 WHAT WHERE [OPTIONS]
(ярлык для упрощения - см. документацию)
Подробнее о RewriteRule здесь http://httpd.apache.org/docs/current/mod/mod_rewrite.html
И на самом деле ваше правило перезаписывает любое количество косых черт. /
к /index.php?shortened_url=$1
если я не ошибаюсь.
Так что ваши https://example.com/
перенаправляется на длинный URL, а также https://example.com/////////
Вам нужно освежить свои навыки регулярного выражения - попробуйте эту ссылку, чтобы помочь вам https://regexr.com/
И, наконец, правило, которое вы ищете, должно быть примерно таким:
RewriteRule ^/index.php\?shortened_url=(.*)$ https://example.com/$1 [L]