Я пытаюсь заставить 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>
Программа cgi вызывается, когда я делаю http-запросы к localhost / doc_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>
это делает работать как положено.
Может ли кто-нибудь помочь мне понять, почему мое правило перезаписи не срабатывает? Или несколько подсказок, как самому разобраться в этом?
Проблема заключалась в том, что если VirtualHosts включен, RewriteRules необходимо использовать в контексте объявления VirtualHost или Directory. Я не уверен, можно ли использовать RewriteRules в глобальном контексте, если VirtualHosts не включен (я думаю, что использовал их таким образом раньше, но, возможно, были изменения с Apache 1.3). В любом случае Apache2 Ubuntu по умолчанию использует VirtualHosts. Я создал VirtualHost для этих компонентов и включил созданные мной файлы конфигурации.
Попробуйте избежать косой черты в правиле перезаписи и отбросьте первую косую черту:
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 записывал в журнал.