【发布时间】:2010-04-22 03:30:58
【问题描述】:
我一生都无法理解为什么这个 RewriteCond 会导致每个请求都发送到我的 FastCGI 应用程序,而实际上它应该让 Apache 提供静态资源。
我已将hello.txt 文件添加到我的 DocumentRoot 以进行演示。
文本文件:
ls /Sites/CioccolataTest.webapp/Contents/Resources/static
hello.txt
VirtualHost 及其重写规则:
AppClass /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest -port 5065
FastCgiExternalServer /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest.fcgi -host 127.0.0.1:5065
<VirtualHost *:80>
ServerName cioccolata-test.webdev
DocumentRoot /Sites/CioccolataTest.webapp/Contents/Resources/static
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest.fcgi/$1 [QSA,L]
</VirtualHost>
即使使用 -f,Apache 也会引导对该文本文件的请求(即访问 http://cioccolata-test.webdev/hello.txt 返回我的应用程序,而不是文本文件)。
作为概念证明,我将 RewriteCond 更改为:
RewriteCond %{REQUEST_URI} !^/hello.txt
这使它正确地为文本文件提供服务,并允许所有其他请求访问 FastCGI 应用程序。
为什么我的原始版本不起作用?我需要告诉 apache 将 DocumentRoot 中的每个文件都作为静态资源提供服务,但如果该文件不存在,它应该重写对我的 FastCGI 应用程序的请求。
注意:正在运行的 FastCGI 应用程序位于 /Sites/CioccolataTest.webapp/Contents/MacOS/CioccolataTest(没有 .fcgi 前缀)... .fcgi 前缀仅用于告诉 fastcgi 模块将请求定向到应用程序。
【问题讨论】:
-
mod_rewrite 语法在我看来是正确的,因为它的价值。我在生产代码中有相同的构造。我的也有: RewriteCond %{REQUEST_FILENAME} !-d
标签: apache mod-rewrite fastcgi