【问题标题】:Removing .php with mod_rewrite使用 mod_rewrite 删除 .php
【发布时间】: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 是在 指令还是 .htaccess 文件中,还是在您的 指令中,或者只是在另一方面,httpd.conf。在 /.htaccess 中时,%{REQUEST_FILENAME} 确实包含路径,所以我的初始解决方案应该在那里工作。在 之外,您需要自己添加%{DOCUMENT_ROOT}

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

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

    我会尝试类似:

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

    【讨论】:

    • 是的,从 RewriteLog 看来,REQUEST_FILENAME 仅填充了文档向您承诺的“完整本地文件系统路径”(如果它确实存在)。你的方案好像解决了这个问题,我试试看!
    • 在 cmets 中转储代码真的不起作用...有人知道更好的方法吗?
    • 没有。为了清楚起见,您可以添加问题的最终答案...谢谢。
    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2015-06-29
    • 2013-10-11
    • 2010-12-14
    • 2012-03-24
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多