我正在开发一个使用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响应。
服务器有权查看文件。
任何帮助都将不胜感激。
答案 0 :(得分:1)
使用%{REQUEST_FILENAME}
代替%{REQUEST_URI}
,因此:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /notfound.html
%{REQUEST_URI}
仅包含/index.html
,因此除非文件系统在根目录中有index.html
文件,否则它将无效。
%{REQUEST_FILENAME}
将包含所请求文件名的完整路径(包括该域的Apache目录根目录)
请注意,在某些特定情况下,REQUEST_URI
和REQUEST_FILENAME
可能会相同,但通常情况下,它们不会。因此,如果要检查服务器本地文件系统中的文件名(就像这样),请使用特定的文件名。