Простой .htaccess Redirect вызывает бесконечный цикл - PullRequest
0 голосов
/ 27 октября 2018

Кто-нибудь может мне помочь?Я использую этот простой оператор для перенаправления корневого index.htm в корневой каталог /

Redirect 301 /index.htm /

Но это вызывает бесконечный цикл.Он перенаправляет на мой корень, поэтому он делает свою работу.Но теперь невозможно отправлять запросы в корень, не получив сообщение об бесконечном перенаправлении.Мой вопрос: почему?И как этого избежать?

€ dit: Теперь у меня есть именно это:

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [NC,QSA,L]

RewriteRule ^((.*)/)?index.[(php)(htm)(html)] $1
[R=301,L]

Если я закомментирую одно из этих правил, другое работает отлично.Однако наличие обоих этих правил в каждом случае приводит к перезаписи корня.Пожалуйста, помогите!

€ dit 2:

Я хочу обработать все входящие запросы одним файлом index.php и перенаправить все index.php, index.htm и index.html на него.каталог из-за дублированного контента.Как это сделать?

€ dit 3:

Теперь все работает как шарм!

RewriteEngine On

RewriteBase /

#Redirects http://host.tld/gamedev to http://gamedev.host.tld/
Redirect 301 /gamedev/ http://gamedev.host.tld/

#Redirects every request to a subdirectory's index file to the subdirectory because of duplicated content
RedirectMatch ^/(.*)/index.(php|html?)$ http://gamedev.host.tld/$1

#Remove index file from a root folder request
RewriteCond %{THE_REQUEST} \s/index\.(php|html?)
RewriteRule ^index\.(php|html?)$ / [R=302,L]

#Handling all incoming requests with index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

Большое спасибо Дарт Мун

Ответы [ 2 ]

0 голосов
/ 28 октября 2018
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [NC,QSA,L]

RewriteRule ^((.*)/)?index.[(php)(htm)(html)] $1
[R=301,L]

... наличие обоих этих правил в каждом случае приводит к перезаписи корня.

Поскольку после того, как первое правило переписало запрос в index.php, процесс перезаписи начинается заново, а второе правило затем удаляет все из URL.

Ваше второе правило неверно. Он не совпадает с тем, что, по вашему мнению, соответствует, и неоправданно совпадает с любым URL-путем. Вы заявили, что это должно соответствовать только документу индекса в корне.

[(php)(htm)(html)] - Предполагается, что целью является сопоставление с любым из этих расширений файлов, но вместо этого оно соответствует одному символу: p, h, t, m или l. Для совпадения php, htm или html необходимо использовать чередование . Например: (php|htm|html) или (php|html?). (? делает l необязательным во втором шаблоне.)

Эти директивы также находятся в неправильном порядке. Внешнее перенаправление должно быть до вашего фронт-контроллера.

@ Ответ Бенджамина в значительной степени находится на кнопке, за исключением условия (которое никогда не будет совпадать) и того, что оно должно идти вверху вашего .htaccess файла.

Попробуйте вместо этого:

RewriteEngine On

RewriteBase /

# Remove /index.php from URL
RewriteCond %{THE_REQUEST} \s/index\.php
RewriteRule ^index\.php$ / [R=302,L]

# Front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

Флаги QSA или NC не требовались при перезаписи.

Причина проверки по THE_REQUEST в первом условии состоит в том, чтобы предотвратить цикл перенаправления (в некоторых ситуациях). THE_REQUEST содержит заголовок Host из исходного запроса и не изменяется после перезаписи URL.

Проверьте с помощью 302 (временные) перенаправления и измените его на 301 (постоянный), только когда вы уверены, что это работает нормально. 301s кэшируется браузером, поэтому тестирование может быть проблематичным. Как всегда, вы должны убедиться, что ваш кеш браузера очищен перед тестированием.

0 голосов
/ 27 октября 2018

Я не думаю, что вы можете сделать это с помощью «Простого перенаправления». Причина, по которой вы получаете бесконечный цикл, заключается в том, что ваш apache пытается доставить содержимое файла /index.htm при доступе к корневому каталогу /, поскольку он является частью списка индексов каталога. Теперь ваше перенаправление вступает в силу (поскольку вы виртуальный обращаетесь к странице /index.htm), и процедура начинается с начала.

Чтобы решить вашу проблему, вы должны использовать правило перезаписи вместо перенаправления. Правило перезаписи влияет только на запрошенный URL и не заканчивается бесконечным циклом. В вашем случае должно работать следующее правило:

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/index\.htm
RewriteRule ^index.htm$ / [R=301,L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...