mod_rewrite找不到存在的文件

时间:2016-05-30 07:22:35

标签: apache mod-rewrite

我正在开发一个使用Apache 2.2的项目,我们正在实现一个重写规则,该规则使用本地磁盘上的文件(如果存在),如果不存在则使用另一台服务器来为该文件提供服务。为了简化问题,我刚刚提出了一个规则,如果文件不存在,重定向到给定的URL:

RewriteCond %{REQUEST_URI} !-f
RewriteRule ^(.*) /notfound.html

现在,重写日志对该请求的输出如下:

127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (2) init rewrite engine with requested uri /index.html
127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (3) applying pattern '^(.*)' to uri '/index.html'
127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (4) RewriteCond: input='/index.html' pattern='!-f' => matched
127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (2) rewrite '/index.html' -> '/notfound.html'
127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (2) local path result: /notfound.html
127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (2) prefixed with document_root to /var/www/html/notfound.html
127.0.0.1 - - [30/May/2016:16:54:01 +1000] [www.blah.com/sid#7f8a4ee0f358][rid#7f8a4f45d7d8/initial] (1) go-ahead with /var/www/html/notfound.html [OK]

当我关闭重写规则并运行相同的命令时,我从服务器得到200响应。

服务器有权查看文件。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用%{REQUEST_FILENAME}代替%{REQUEST_URI},因此:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /notfound.html

%{REQUEST_URI}仅包含/index.html,因此除非文件系统在根目录中有index.html文件,否则它将无效。

%{REQUEST_FILENAME}将包含所请求文件名的完整路径(包括该域的Apache目录根目录)

请注意,在某些特定情况下,REQUEST_URIREQUEST_FILENAME可能会相同,但通常情况下,它们不会。因此,如果要检查服务器本地文件系统中的文件名(就像这样),请使用特定的文件名。