【发布时间】:2010-12-12 23:04:00
【问题描述】:
我想重写我的所有 URL 以隐藏 .php 扩展名。将.php 添加到所有 URL 的一般规则显然是行不通的,所以我希望这条规则的条件是
- 没有与 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
我觉得奇怪的是它试图匹配 /contact,而不是 /var/www/mysite/htdocs/contact(至少这是我在阅读 REQUEST_FILENAME 上的文档时所期望的)。显然REQUEST_FILENAME 只是我在实际匹配时所期望的?
EDIT2
感谢Thomas 的回答:改用%{DOCUMENT_ROOT} 手动编写尚未找到的PHP 文件的完整文件名。
我还添加了一个额外的“/?”在正则表达式中删除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 是在 %{REQUEST_FILENAME} 确实包含路径,所以我的初始解决方案应该在那里工作。在 %{DOCUMENT_ROOT}。
【问题讨论】:
标签: apache mod-rewrite