Apache MOD_REWRITE Правило в httpd.conf для модификации некоторых путей, но не другие
-
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$
) и лишнее в любом случае.