Назад | Перейти на главную страницу

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

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

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]