我正在尝试让 Apache 在我的“项目”目录中运行一个 cgi 可执行文件。它应该响应以下位置的 HTTP 请求:
localhost/packages
localhost/packages/
然而,它应该不是响应 http 请求
localhost/packages/PackageName
localhost/packages/PackageName/
localhost/packages/PackageName/more/stuff
为此,我创建了一个 Apache 配置文件,其中包含:
ScriptAlias /doc_cgi/ /long/path/to/cgi/DocCGI.haskell/
RewriteEngine On
RewriteRule ^/packages/?$ /doc_cgi/packages/ [L,PT]
<Directory "/long/path/to/cgi/">
Order deny,allow
Allow from all
AddHandler cgi-script .haskell
Options +ExecCGI
</Directory>
当我向 localhost/doc_cgi/ 发出 http 请求时,cgi 程序被调用,正如预期的那样。但是当我向以下对象发出请求时,似乎没有触发重写规则:
localhost/packages
localhost/packages/
因为我收到 404 错误,并且日志显示:
[Wed Jul 20 12:29:42 2011] [error] [client 127.0.0.1] File does not exist: /var/www/packages
为了完整起见,这里是配置文件的相关部分,它定义了我如何处理对 localhost/packages/PackageName/etc 的请求:
AliasMatch ^/packages/(.+)/(.*) /development/code/haskell/packages/$1/dist/doc/html/$1/$2
<Directory /development/code/haskell/packages/*/dist/doc/html/*/ >
Options Indexes
Order deny,allow
Allow from all
</Directory>
这做按预期工作。
有人能帮我找出为什么我的重写规则没有被触发吗?或者有什么提示可以告诉我如何自己找出原因?
答案1
尝试在重写规则中转义斜杠并删除第一个斜杠:
RewriteRule ^packages\/?$ doc_cgi/packages/ [L,PT]
如果这不起作用,您还可以启用重写日志,这是一个很好的教程:
http://perishablepress.com/press/2006/11/28/roll-your-own-apache-rewrite-log/
您可以发布相关日志条目,以便我们查看
这些是我的 httpd.conf 中的指令,只是为了确保:
<IfModule mod_rewrite.c>
RewriteLog "/home/user_name/apachelog.log"
RewriteLogLevel 9
</IfModule>
当然,请用您自己的路径替换“/home/user_name/apachelog.log”。当然,您必须发出 HTTP 请求,以便 apache 写入日志。
答案2
问题是,如果启用了 VirtualHosts,则必须在 VirtualHost 或 Directory 声明的上下文中使用 RewriteRules。我不确定如果未启用 VirtualHosts,是否可以在全局上下文中使用 RewriteRules(我想我以前曾这样使用过,但可能自 Apache 1.3 以来发生了变化)。无论如何,Ubuntu 的 Apache2 默认使用 VirtualHosts。我为这些组件创建了一个 VirtualHost,并包含了我制作的配置文件。