我想让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文件。