2015-09-23 3 views
3

Задача кажется очень простой:Как остановить цикл перенаправления RewriteEngine/PHP?

все запросы должны быть переданы через один файл.

Однако

, когда следующий код добавляется в httpd.conf:

RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ /index.php?route=$1 [QSA,R=301,L] 

и следующий код добавляется /index.php:

if(isset($_GET["route"]) && $_GET["route"] != "/index.php"){ 
header("Location: ".$_GET["route"]); 
} 

, то это вызывает перенаправление цикл !

Причины для примера такого цикла:

www.site.com/image.jpg -> (перенаправляются httpd.conf)

www.site.com/index.php?route =/image.jpg -> (перенаправляются index.php)

www.site.com/image.jpg -> (перенаправляются httpd.conf)

www.site.com/index.php?route=/image.jpg -> (перенаправляется index.php)

...

Итак, вопрос следующий:

Как остановить этот цикл?

Чтобы остановить, например, таким образом:

www.site.com/image.jpg -> (перенаправляются httpd.conf)

www.site.com/index. PHP не путь =/image.jpg -> (перенаправляется index.php)

www.site.com/image.jpg (не далее перенаправление)

+0

Что именно вы хотите выполнить с помощью этой схемы перезаписи/перенаправления? Это поможет найти решение. – Amarnasan

+0

@amarnasan написано в начале сообщения - все запросы должны быть переданы через один файл (который выполняет некоторые дополнительные операции перед началом собственного запроса на обработку) – valeryan

ответ

1

Это немного исправление, но я думаю, что это работает.

httpd.conf:

RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !^(.*)a=a$ [NC] 
RewriteRule ^(.*) index.php?route=$1 [QSA,L] 

index.php:

<?php 
if(isset($_GET["route"]) && $_GET["route"] != "/index.php"){ 
    header("Location: ".$_GET["route"].'?a=a'); 
} 

Вещь: первый раз переписывают двигатель перенаправляет страницу index.php. Затем в index.php есть перенаправление к тому же файлу, но добавление параметра a=a. Затем перезаписывается двигатель, но он имеет заказы не перенаправлять, когда в строке запроса найдена строка a=a, и нет никакого дальнейшего перенаправления.

Конечно, это закончится ошибкой 404, так как вы фильтруете только несуществующие файлы с двумя первыми rewritecond, но я думаю, вы знаете, как с этим бороться.

+0

** Работает точно так, как ожидалось! Большое спасибо за решение! ** – valeryan

-1

Почему вы это делаете:

RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ /index.php?route=$1 [QSA,R=301,L] 

В httpd.conf? Вы должны поместить это в файл с именем .htaccess, создайте его в свой корневой каталог.

+1

А что, если он хочет поместить его в httpd.conf? – Amarnasan

+0

@ konstantin-rachev "разрешает .htaccess файлы вызывает удар производительности" (руководство Apache) – valeryan

+0

И это решение? Разрешить удар производительности? Остановить цикл, двигаясь быстрее? – Amarnasan

0

Во-первых, поместите это в файл .htaccess, а не в httpd.conf

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /index.php [QSA,R=301,L] 

Затем удалите это перенаправление из файла index.php. Вы можете получить все переменные через $ _GET или $ _REQUEST.

+0

Во-первых: «разрешить файлы .htaccess вызывает удар производительности» (руководство Apache). Затем: RewriteEngine переписывает указанные переменные. – valeryan

+0

@ пользователь3119308 Конечно, все будет. Но если вы имеете дело только с одним файлом .htaccess, вы никогда не заметите этого повышения производительности. –

0

Какие бессмысленные решения. Конечно, это вызовет цикл перенаправления. В RewriteCond вы пытаетесь поймать имена файлов и dirs, которые не существуют в файловой системе сервера, а затем вы пытаетесь передать их имена индексу.php, в котором вы делаете запрос снова, снова и снова.

+0

Если таких RewriteCond-s нет, то это не решит проблему. Таким образом, это не решение. Более того, в этом случае $ _SERVER [SCRIPT_NAME] не показывает, какой файл действительно запрашивается (после перенаправления командой DirectoryIndex). – valeryan

+0

Проблема не в вашей RewriteCond, а в отправляющем заголовке 302 в вашем /index.php, где не существует файла или имени dir, что снова вызывает правила перезаписи. – Eugeny

1

Ваше правило выглядит нормально, но R=301 немного странно в вашем правиле, так как вы не хотите раскрывать свой внутренний URL-адрес в браузере.

Однако PHP код ищет подозреваемого в связи с этим условием:

$_GET["route"] != "/index.php" 

Который всегда будет true, так как сам /index.php не будет проходить через это правило в связи с этими условиями:

RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

Следовательно ваш код вызовет цикл перенаправления, непрерывно перенаправляя с помощью функции header.

Я предлагаю держать ваше правило так:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.+)$ /index.php?route=$1 [QSA,L] 

И ваш PHP код должен просто проверить наличие $_GET['route'], но не должны делать никаких переадресаций.

0

Существует одна шаблонный, что может пригодиться, он должен быть помещен на вершине, после RewriteEngine при условии:

RewriteEngine on 
RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$ 
RewriteRule^- [L] 

добавляли окр, он работает с теорией, однако я тестировал только один раз, посмотрите, сможет ли он решить проблему.

+0

Извините, может быть, это хорошее решение в каком-то другом случае, но не в этом случае, потому что оно вообще избегает перенаправления, но в этом случае необходимо еще одно перенаправление (to index.php и back). – valeryan