我想重写所有网址以隐藏.php
扩展程序。将.php
添加到所有网址的一般规则显然不会这样做,所以我希望此规则以
.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}
。
答案 0 :(得分:1)
我不太确定使用REQUEST_FILENAME。 REQUEST_FILENAME应指向匹配文件的完整路径,但实际上您正在检查它是否存在。
我会尝试类似的事情:
RewriteCond %{DOCUMENT_ROOT}/$1 !-f
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.*)$ $1.php [L]