«Запрос превысил предел в 10 внутренних перенаправлений» с простым правилом перезаписи

Я пытаюсь написать простое правило перезаписи, которое изменится: с

https://example.com/index.php?shortened_url=value

на

https://example.com/value

Чтобы добиться этого, я использую следующее правило перезаписи:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?shortened_url=$1 [L]

Но Я получаю сообщение об ошибке:

Запрос превысил лимит в 10 внутренних перенаправлений из-за возможной ошибки конфигурации.

Очевидно, это говорит о том, что где-то есть проблема с зацикливанием, но, насколько я могу судить, мое правило довольно простое и не должно ' не вызывает зацикливание?

1
задан 4 October 2017 в 15:58
2 ответа
 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 ?)

Однако код выглядит так, как будто он работает правильно, поэтому я думаю, это просто ваше описание. (?) (Любопытно ... люди часто описывают это так, как вы это делали - в обратном порядке - как будто они описывают конечный результат в приложении, а не то, что на самом деле делает директива.)

1
ответ дан 3 December 2019 в 20:19

Прежде всего, вы потеряли аргументы для команды 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]

1
ответ дан 3 December 2019 в 20:19

Теги

Похожие вопросы