Apache Mod_Rewrite:别名和 CGI

Apache Mod_Rewrite:别名和 CGI

我正在尝试让 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,并包含了我制作的配置文件。

相关内容