多个mod_rewrite规则生成重定向循环

时间:2012-03-15 19:49:12

标签: apache mod-rewrite url-rewriting

使用mod_rewrite,我想要两条规则:

  • 将.htm和.html请求重写为.php
  • 删除.php扩展名

以便http://example.com/page.html调用http://example.com/page http://example.com/page.php调用http://example.com/page

我试过这个,当我介绍.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的新手;有谁能告诉我如何更正我的代码?

1 个答案:

答案 0 :(得分:0)

您的RewriteCond条件太弱而无法捕获重写循环;他们只检查正在重写的路径是否要求具体的文件或目录。

是的,您的第一个重写规则应该停止循环,但条件仅适用于第一个RewriteRule;你的第二个RewriteRule是无条件的。每个RewriteRule都有自己的RewriteCond - s。

(第一条规则仍然可以循环,因为输入可以多次包含.htm;在每次重写回合时,如果不包含包含.htm匹配项的部分,则会删除一个.htm在重写。)

你的第二个RewriteRule是相对重写的。如果这是.htaccess文件或<Directory>配置(每个目录上下文),则需要RewriteBase。否则,重写将采用http://example.com/foo并生成http://example.com/path/to/docroot/foo.php形式的网址,该网址仅在您的设置被黑客入侵以接受/path/to/docroot/作为与/同义的网址时才有效。