1

mod_rewrite 有一个奇怪的问题。

URI like/news将正确匹配,因为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)文件。

4

1 回答 1

1

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

于 2012-05-22T16:52:02.767 回答