2012-03-15 3 views
0

Использование mod_rewrite, я хочу иметь два правила:Несколько правил mod_rewrite генераторной перенаправлять цикла

  • переписывания .htm и .html запросов на .php
  • удалить расширение .php

так, что http://example.com/page.html звонки http://example.com/page и что http://example.com/page.php звонки http://example.com/page

Я попробовал это бее ch breaks, когда я вводил правило .html:

Options +FollowSymlinks 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.htm(.*)$ http://%{HTTP_HOST}/$1.php [R,NC] 
RewriteRule (.*) $1.php [R=301, L] 

Я довольно новичок в mod_rewrite; может ли кто-нибудь показать мне, как исправить мой код?

ответ

0

Ваши RewriteCond условия слишком слабы, чтобы поймать петлю перезаписи; они только проверяют, что переписанный путь запрашивает конкретный файл или каталог.

Да, ваше первое правило перезаписи должно прекратить цикл, но условия применимы только к первому RewriteRule; ваш второй RewriteRule является безусловным. Каждый RewriteRule имеет свои собственные RewriteCond-s.

(Первое правило может еще цикл, так как входной сигнал может содержать .htm несколько раз, при каждом переписывании раунда вам удалить один .htm не включая ту часть, которая содержит соответствие для .htm в переписывании.)

Ваших второе RewriteRule является относительным переписыванием. Если это файл .htaccess или конфигурация <Directory> (контекст для каждого каталога), вам необходимо RewriteBase. В противном случае переписывание займет http://example.com/foo и сформирует URL-адрес формы http://example.com/path/to/docroot/foo.php, который будет работать только в том случае, если ваша установка взломана, чтобы принять /path/to/docroot/ в качестве URL-адреса, синонимом /.

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