PHP: htaccess: правила перезаписи получают 500 ERROR на несуществующих страницах - PullRequest
1 голос
/ 03 декабря 2011

У меня есть веб-сайт, который в основном скрывает .php с помощью RewriteRule, а также позволяет сценарию определять параметр по слешам.

Итак, пример: http://www.dealhandler.com/deals/san-jose/Living%20Social/233102

Сценарий - deal.php, который принимает такие параметры, как san-jose, live social и идентификатор сделки.

Вот мой .htaccess:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^dealhandler.com 
RewriteRule ^(.*)$ http://www.dealhandler.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)(.*)$ $1.php$2 [L,QSA]

ПРОБЛЕМА: Если посетитель вводит недопустимый URL-адрес, у которого нет сценария на корневом уровне, я получаю 500 ОШИБКИ.

Пример: http://www.dealhandler.com/idontexist Я получу:

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.

Есть ли способ сохранить текущую функцию, но быть достаточно умным, чтобы остановить и перенаправить, если файл корневого уровня не существует?

Ответы [ 4 ]

1 голос
/ 03 декабря 2011

Попробуйте добавить это прямо перед вашим RewriteRule:

RewriteCond %{REQUEST_URI} !^/[^/]+\.php

Запросы, которые не отображаются в действительный файл php (например, idontexist.php), должны просто возвращать 404.

1 голос
/ 03 декабря 2011

Вот что следует избегать бесконечных циклов: просто протестируйте first , если это не файл или dir, и если он заканчивается на "php", немедленно остановитесь. Если нет правил, продолжайте и попробуйте свой собственный тест:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^dealhandler.com 
RewriteRule ^(.*)$ http://www.dealhandler.com/$1 [R=301,L]

# if it's not a file...
RewriteCond %{REQUEST_FILENAME} !-f
# ... and it's not a dir...
RewriteCond %{REQUEST_FILENAME} !-d
# ...and it ends by "php" then stop:
RewriteRule (.*)\.php$ - [L]

# if it's not a file...
RewriteCond %{REQUEST_FILENAME} !-f
# ... and it's not a dir...
RewriteCond %{REQUEST_FILENAME} !-d
# ...rewrite it to php:
RewriteRule ^([^/]*)(.*)$ $1.php$2 [L,QSA]
1 голос
/ 03 декабря 2011

На первый взгляд кажется, что вы бесконечно добавляете .php всякий раз, когда он не находит файл с заданным именем. Если вы включите ведение журнала отладки, вы сможете легко это подтвердить.

Ваши лучшие варианты, либо 1) Добавлять .php только к строкам, которые еще не заканчиваются на .php, поэтому это произойдет только один раз или же 2) Проверьте, существует ли потенциальное новое имя файла .php в другом Условии, прежде чем применять Правило вообще

0 голосов
/ 04 декабря 2011

Проверьте ваш ../apache/conf/httpd.conf и найдите:

#LoadModule rewrite_module modules/mod_rewrite.so

Если знак хеша (#) отображается как первая буква, удалите его, сохраните и перезапустите сервер.

...