Apache MOD_REWRITE Правило в httpd.conf для модификации некоторых путей, но не другие

StackOverflow https://stackoverflow.com/questions/2763276

  •  02-10-2019
  •  | 
  •  

Вопрос

У меня довольно вызов, создавая соответствующее правило перезаписи для Apache / 2.2.14 на Fedora 10. Я работаю через Учебное пособие который использует файл .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 в таких случаях, но журнал Rewrite говорит, что условия верны (то есть файл не существует), даже если он там.

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 будут правильно переведены. Что я делаю неправильно?

Это было полезно?

Решение

Чтобы сделать это на работу, я должен был изменить операторы Rewritecond, как так:

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top