Правило apache mod_rewrite в httpd.conf для изменения одних путей, но не для других

У меня возникла проблема с созданием подходящего правила перезаписи для Apache/2.2.14 в Fedora 10. Я работаю с учебник CodeIgniter-Doctrine, в котором используется файл .htaccess. (Ищите Удаление «index.php» из URL-адресов CodeIgniter примерно на 10%.) Но, поскольку это не рекомендуется для рабочего сервера, я пытаюсь настроить его для работы в /etc/httpd/ conf/httpd.conf.

<VirtualHost *:80>
    ServerName ci_doctrine
    DocumentRoot /var/www/html/ci_doctrine
    ErrorLog /var/log/httpd/cid-error_log
    CustomLog /var/log/httpd/cid-access_log common
        <IfModule mod_rewrite.c>
                RewriteEngine on
                RewriteLog /var/log/httpd/cid_rewrite
                RewriteLogLevel 9

#               RewriteCond ^/css/style.css$  (these have bad syntax, but that's beside the point)
#               RewriteRule ^/css/style.css$ /css/style.css [L]

                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^(.*)$ /index.php/$1 [L]
        </IfModule>
        <IfModule !mod_rewrite.c>
                ErrorDocument 404 /ci_doctrine/index.php
        </IfModule>
</VirtualHost>

Похоже, что правила учебника .htaccess правильно проверяют существующие файлы, а затем не изменяют URL-адрес в таких случаях, но журнал перезаписи говорит, что условия верны (то есть файл не существует), даже если он есть.

127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) init rewrite engine with requested uri /login
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (3) applying pattern '^(.*)$' to uri '/login'
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (4) RewriteCond: input='/login' pattern='!-f' => matched
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (4) RewriteCond: input='/login' pattern='!-d' => matched
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) rewrite '/login' -> '/index.php//login'
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) local path result: /index.php//login
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) prefixed with document_root to /var/www/html/ci_doctrine/index.php/login
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (1) go-ahead with /var/www/html/ci_doctrine/index.php/login [OK]
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) init rewrite engine with requested uri /login
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (3) applying pattern '^(.*)$' to uri '/login'
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (4) RewriteCond: input='/login' pattern='!-f' => matched
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (4) RewriteCond: input='/login' pattern='!-d' => matched
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) rewrite '/login' -> '/index.php//login'
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) local path result: /index.php//login
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) prefixed with document_root to /var/www/html/ci_doctrine/index.php/login
127.0.0.1 - - [03/May/2010:23:26:56 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (1) go-ahead with /var/www/html/ci_doctrine/index.php/login [OK]
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) init rewrite engine with requested uri /css/style.css
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (3) applying pattern '^(.*)$' to uri '/css/style.css'
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (4) RewriteCond: input='/css/style.css' pattern='!-f' => matched
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (4) RewriteCond: input='/css/style.css' pattern='!-d' => matched
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) rewrite '/css/style.css' -> '/index.php//css/style.css'
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) local path result: /index.php//css/style.css
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (2) prefixed with document_root to /var/www/html/ci_doctrine/index.php/css/style.css
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#167e8e0/initial] (1) go-ahead with /var/www/html/ci_doctrine/index.php/css/style.css [OK]
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) init rewrite engine with requested uri /css/style.css
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (3) applying pattern '^(.*)$' to uri '/css/style.css'
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (4) RewriteCond: input='/css/style.css' pattern='!-f' => matched
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (4) RewriteCond: input='/css/style.css' pattern='!-d' => matched
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) rewrite '/css/style.css' -> '/index.php//css/style.css'
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) local path result: /index.php//css/style.css
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (2) prefixed with document_root to /var/www/html/ci_doctrine/index.php/css/style.css
127.0.0.1 - - [03/May/2010:23:26:58 --0700] [ci_doctrine/sid#13c1868][rid#16848f8/subreq] (1) go-ahead with /var/www/html/ci_doctrine/index.php/css/style.css [OK]

Файл .../css/style.css работал правильно до того, как я начал возиться с правилами перезаписи, поэтому он должен быть в нужном месте. Но теперь путь всегда искажается переписыванием, хотя виртуальные компоненты ниже index.php переведены правильно. Что я делаю не так?


person wallyk    schedule 04.05.2010    source источник


Ответы (3)


Чтобы заставить это работать, мне пришлось изменить операторы ReWriteCond следующим образом:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d

В документации для REQUEST_FILENAME говорится: «Полный путь локальной файловой системы к файлу или сценарию, соответствующему запросу», но для меня всегда отсутствовала часть пути DocumentRoot, что означает, что тест «файл существует» всегда будет ложным.

Может быть, это ошибка апача, а может, просто ошибка документации. Я не знаю эту часть. http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

person bukzor    schedule 11.05.2010

Вы закомментировали эти правила:

#               RewriteCond ^/css/style.css$  (these have bad syntax, but that's beside the point)
#               RewriteRule ^/css/style.css$ /css/style.css [L]

Последнее из этих правил обнаруживает запрос на таблицу стилей, перезаписывает его по тому же адресу (т. е. ничего не делает), а затем указывает «Я — последнее правило», что означает, что при совпадении никакие другие правила не будут выполняться, что предотвращает его затем сопоставление по правилам, найденным позже.

Если вы уберете # из начала этой строки, ваш файл style.css снова будет работать, хотя это не самый лучший способ выполнить преобразование адресов, так как вам придется добавлять аналогичное правило для каждого файла, который вы не используете. хочу переписать.

person Fenton    schedule 04.05.2010
comment
Я закомментировал их, потому что они препятствовали перезапуску apache. Сообщения об ошибках: Syntax error on line 1022 of /etc/httpd/conf/httpd.conf: RewriteCond: bad argument line '^/css/style.css$' - person wallyk; 04.05.2010

Раскомментируйте только RewriteRule для style.css, так как ваш RewriteCond неправильный (должен быть RewriteCond %{REQUEST_URI} ^/css/style.css$) и в любом случае лишний.

person Dan McGrath    schedule 10.05.2010