Назад | Перейти на главную страницу

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>

Программа 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 записывал в журнал.