Apache Mod_Rewrite:别名和CGI

我想让Apache在我的“项目”目录中运行一个cgi可执行文件。 它应该在以下位置响应HTTP请求:

localhost/packages localhost/packages/ 

但是,它不应该响应HTTP请求

 localhost/packages/PackageName localhost/packages/PackageName/ localhost/packages/PackageName/more/stuff 

为此,我创build了一个Apacheconfiguration文件,其中包含:

 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 

为了完整起见,下面是configuration文件的相关部分,它定义了我如何处理对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> 

确实按预期工作。

任何人都可以帮我找出为什么我的重写规则没有被触发? 或者如何弄清楚自己的一些提示?

尝试在重写规则中跳出斜杠并删除第一个斜杠:

 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> 

当然用你自己的pathreplace“/home/user_name/apachelog.log”。 当然,你将不得不做HTTP请求,所以Apache将写入日志。

问题是,如果启用了VirtualHosts,则必须在VirtualHost或Directory声明的上下文中使用RewriteRules。 我不知道如果RewriteRules可以在全局上下文中使用,如果VirtualHosts没有启用(我想我以前用过它们,但也许从Apache 1.3开始就有了变化)。 无论如何,Ubuntu的Apache2默认使用VirtualHosts。 我为这些组件创build了一个VirtualHost,并包含了我所做的configuration文件。