使用mod_rewrite删除.php

时间:2009-11-04 09:41:11

标签: apache mod-rewrite

我想重写所有网址以隐藏.php扩展程序。将.php添加到所有网址的一般规则显然不会这样做,所以我希望此规则以

为条件的条件为条件
  • 没有与URL匹配的文件或目录
  • 添加.php后, 匹配

我已经达到了这些重写规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]

前两个负责检查是否可以在不重写的情况下满足请求(因此对于图像和其他非PHP内容)。根据第三条规则,我想检查添加.php是否会使请求有效(如果没有,我们会在重写规则下再尝试其他内容,或者返回404)。

RewriteCond %{REQUEST_FILENAME}.php -f部分似乎永远不会匹配。有什么建议吗?

修改

重写日志包含以下条目:

(4) RewriteCond: input='/contact' pattern='!-f' => matched 
(4) RewriteCond: input='/contact' pattern='!-d' => matched 
(4) RewriteCond: input='/contact.php' pattern='-f' => not-matched 

我觉得奇怪的是它正在尝试匹配/联系,而不是/ var / www / mysite / htdocs / contact(至少这是我在阅读REQUEST_FILENAME上的文档时所期望的)。显然REQUEST_FILENAME只是在我有实际匹配时的期望?

EDIT2

感谢Thomas的答案:使用%{DOCUMENT_ROOT}代替手动编写尚未发布的PHP文件的完整文件名。

我还投入额外的'/?'在regexp中删除URL末尾的可选项,现在所有/ contact,/ contact /和/contact.php都引用/contact.php:

RewriteCond %{DOCUMENT_ROOT}$1 !-f
RewriteCond %{DOCUMENT_ROOT}$1 !-d
RewriteCond %{DOCUMENT_ROOT}$1\.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

更新

经过大量的诅咒,我也发现它取决于RewriteRules是否在< Directory>内。指令或.htaccess文件,或者在< VirtualHost>中另一方面,指令或仅在httpd.conf的主体中。在< Directory> /。htaccess中,%{REQUEST_FILENAME}确实包含路径,因此我的初始解决方案应该在那里工作。在< Directory>之外,您需要自己添加%{DOCUMENT_ROOT}

1 个答案:

答案 0 :(得分:1)

我不太确定使用REQUEST_FILENAME。 REQUEST_FILENAME应指向匹配文件的完整路径,但实际上您正在检查它是否存在。

我会尝试类似的事情:

RewriteCond  %{DOCUMENT_ROOT}/$1         !-f
RewriteCond  %{DOCUMENT_ROOT}/$1\.php    -f
RewriteRule  ^(.*)$                      $1.php [L]