2017-01-25 4 views
0

У меня был Centos 5 VPS и перешел на Centos 7 с Apache 2.4. Я не знаю, какова была моя ранняя версия Apache для системы Centos 5, но я знаю, что мое правило Rewrite отлично работает.Правило rewrite не работало, когда я перешел на новую версию Apache (2.4)

Однако, когда я переехал в Apache 2.4 мое старое правило переписывания перестало работать:

Старое Правило:
RewriteRule ^(\/[^\.]*)$ /index.php?page=$1 [NC]
Триггеров эта ошибка в журнале ошибок:

AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace. AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

New Rule Я попытался которые, по крайней мере, делают мой сайт www.domainname.com:
RewriteRule ^([^/]*)$ /index.php?page=$1 [NC]

Что нового в Apache 2.4? Я не мог найти подсказки ни здесь, ни в Google.

+0

Ну, конечно, это приведет к циклу перезаписи, но это не имеет ничего общего с версией сервера http. Вы переписываете цель, которая снова соответствует шаблону, который вы используете. Так как это правило _changes_ цель с каждой переписывать, всегда запускается новый цикл перезаписи. Бесконечно ... Вам нужно добавить 'RewriteCond', который предотвращает пересылку запросов на' index.php' ... – arkascha

+1

Хорошо. Спасибо за совет. Еще один вопрос: как вы объясните, что до сих пор он не нуждался в RewriteCond? – besciualex

+0

Не совсем уверен, мне пришлось бы потратить время на это или даже проверить его ... Конечно, старый шаблон должен был избегать цикла из-за того, что он не принял точку ('.') В запросе, хотя это, очевидно, довольно грубая стратегия ... Может быть, это просто эффект пресловутой директивы 'MultiViews' ... Но так или иначе:' RewriteCond' определенно имеет смысл ... – arkascha

ответ

1

Вам необходимо добавить RewriteCond, который предотвращает пересылку запросов на index.php. Два подхода приходит на ум:

1) только переписать, если запрос делает не цели существующего физический файл:

Options -MultiViews 
RewriteEngine on 
RewriteCond %{REQUEST_URI} !-f 
RewriteRule ^/?([^/]*)$ /index.php?page=$1 [END] 

2) только переписать, если запрос не явно целевой /index.php местоположения:

Options -MultiViews 
RewriteEngine on 
RewriteCond %{REQUEST_URI} ^/index\.php$ 
RewriteRule ^/?([^/]*)$ /index.php?page=$1 [END] 

ведущий ^/? убеждается, что эта модель будет работать в .htaccess стилевых файлах и в реальной конфигурации хостов HTTP-серверов. Это имеет смысл, потому что:

Общий совет: вы всегда должны ставить такие правила внутри конфигурации хоста http-серверов вместо файлов стиля .htaccess. Эти файлы, как известно, подвержены ошибкам, трудно отлаживаются, и они действительно замедляют работу сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет контроля над конфигурацией хоста (читай: действительно дешевые хостинг-провайдеры) или если у вас есть приложение, которое опирается на составление собственных правил перезаписи (что является очевидным кошмаром безопасности).

+0

Спасибо за ваш ответ и дополнительную наконечник. К счастью, я не использую файлы .htaccess :). Что касается ответа, это было именно то, что мне нужно. Обновите это правило: * RewriteRule^/? ([^ \] *) $ /index.php?page=$1 [END] * to * RewriteRule^/? ([^ /] *) $ /index.php?page = $ 1 [END] *, чтобы другие увидели точный ответ на ответ. Еще раз спасибо. Постскриптум Трудно заметить, но одна обратная косая черта - косая черта. :) – besciualex

+0

@besciualex Ну, вы отметили свой вопрос '.htaccess' ... – arkascha

+0

@besciualex Эта модификация правила не имеет никакого смысла, извините. Этот шаблон будет соответствовать только URI запроса, состоящему из одной буквы ... – arkascha

 Смежные вопросы

  • Нет связанных вопросов^_^