为不同的REQUEST_URI获取相同的REQUEST_FILENAME

时间:2012-05-22 15:15:00

标签: .htaccess mod-rewrite

与mod_rewrite有一个奇怪的问题。

/news之类的URI会因news.php存在而正确匹配。但是,/news/1900-01-01/title会匹配/news

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$ #workaround for URIs ending in a slash passing the previous check
RewriteRule ^(.*)$ debug.php?page=$1.php&req_filename=%{REQUEST_FILENAME}&req_uri=%{REQUEST_URI} [L]

如果使用/news运行,则会产生预期结果:

page=/news.php
req_filename=/home/domain/public_html/news
req_uri=/news

如果使用/news/1900-01-01/title运行,则会生成:

page=/news/1900-01-01/title.php
req_filename=/home/domain/public_html/news
req_uri=/news/1900-01-01/title

为什么%{REQUEST_FILENAME}两者都相同?

我已经为新闻项目进行了解决方案;将RewriteRule ^news/([0-9]{4}-[0-9]{2}-[0-9]{2})/([a-zA-Z0-9\-]+)$ news-item.php?date=$1&title=$2 [L]移到此代码段之上。但是,我想了解2个唯一URI如何解析为相同的不存在(脚本添加.php)文件。

1 个答案:

答案 0 :(得分:1)

Apache试图找到最低的"真实"目录,然后处理对应于该目录的指令(例如.htaccess或其他特定于dir的指令)。在您的情况下,我假设URI与任何真实目录都不对应。 Apache然后使用内容协商,如果设置了Multiviews(我怀疑它是在你的情况下),那么它会根据文件名找到最佳匹配。既然你有news.php,那就是匹配的东西。如果您想了解更多信息,可以查看解释关键字“内容谈判”和“多元主义”的页面。