2010-11-30 5 views
0

Я использую Kohana Framework 3.x. Мой веб-сервер - это Apache, и я использую виртуальные хосты, потому что я управляю несколькими сайтами с моим сервером.Apache: виртуальный хост и URL-адрес Перезапись внутри httpd.conf для платформы Kohana

Мой httpd.conf выглядит следующим образом:

<VirtualHost *:80> 
ServerName www.myPage1.com 
ServerAlias myPage1.com 
DocumentRoot /var/www/myPage1 
</VirtualHost> 
<VirtualHost *:80> 
ServerName www.myPage2.com 
ServerAlias myPage2.de 
DocumentRoot /var/www/myPage2 
</VirtualHost> 

В Кохана каждый запрос HTTP должен пойти в index.php первый. Потому что я не люблю эти уродливые URL, что все начинается с index.php (например, www.myPage1.com/index.php/item/detail/itemId) Я использовал следующий файл .htaccess, который работал отлично

# Turn on URL rewriting 
RewriteEngine On 

# Installation directory 
RewriteBase/

# Protect hidden files from being viewed 
<Files .*> 
    Order Deny,Allow 
    Deny From All 
</Files> 

# Protect application and system files from being viewed 
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L] 

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# Rewrite all other URLs to index.php/URL 
RewriteRule .* index.php/$0 [PT] 

Теперь я хотел бы больше не использовать файл .htaccess и вместо этого переместить всю логику перезаписи в файл httpd.conf. Следующее дает мне «400 Bad Request»

<VirtualHost *:80> 
RewriteEngine On 
<Files .*> 
    Order Deny,Allow 
    Deny From All 
</Files> 
RewriteRule ^(?:aplication|modules|system)\b.* index.php/$0 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* index.php/$0 [PT] 

ServerName www.myPage2.com 
ServerAlias myPage2.com 
DocumentRoot /var/www/myPage2 
</VirtualHost> 

Что я делаю неправильно? Помощь будет оценена!

ответ

2

У вас нет RewriteBase в вашем httpd.conf. И что случилось с .htaccess?

+0

Я думал, что мне просто нужен RewriteBase, когда я использую URL-адрес перезаписи для каталога с файлом .htaccess. Если моя RewriteBase похожа на «/», я не могу запустить apache и получить ошибку. Я больше не хочу использовать файл .htaccess, потому что хочу, чтобы все настройки были в центре моего httpd.conf. – 2010-12-02 19:32:14

+1

В `.htaccess` есть много чего-то неправильного, основным из которых является дополнительный доступ к диску для каждого каталога под корень документа в пути запроса, по каждому запросу. Ваш сервер будет работать значительно быстрее, если вы отключите сканирование для таких файлов (`AllowOverride None`). – 2013-07-25 07:05:13

1

это может быть это опечатка (возможно, это должно быть «приложение»):

RewriteRule ^(?:aplication|modules|system)\b.* index.php/$0 [L] 
1

Помните, что если вы поставите эти правила в главном файле сервера конф (обычно httpd.conf), а не .htaccess файл, вам нужно будет использовать ^/... ... вместо^... ... в начале строки RewriteRule, другими словами, добавить косую черту.

проверить это, может помочь.

3

Если вы используете mod_rewrite в VirtualHost блоке с условием REQUEST_FILENAME, вы не получить имя файла (это на the documentation). Вместо этого эта переменная содержит то же значение, что и REQUEST_URI, которое содержит путь, исключающий строку запроса.

Цитируя выше связаны страницы:

При использовании в каждого сервера контекста (то есть до того, как запрос отображается в файловой системе) SCRIPT_FILENAME и REQUEST_FILENAME не может содержать полный локальный путь файловой системы, так как путь неизвестный на этом этапе обработки. В обоих случаях обе переменные будут содержать значение REQUEST_URI. Чтобы получить полный путь к локальной файловой системе запроса в контексте для каждого сервера, используйте URL-адрес look-ahead% {LA-U: REQUEST_FILENAME}, чтобы определить окончательное значение REQUEST_FILENAME.

Однако, я обнаружил, что предложил решение %{LA-U:REQUEST_FILENAME}не работает, по крайней мере, не для виртуальных хостов на моем сервере. Чтобы быть уверенным RewriteCond линии функционируют как ожидается, в VirtualHost блоке, вы должны префикс их DOCUMENT_ROOT, таким образом:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 

Этот метод будет работать всегда. Переключение на _URI в случае, если REQUEST_FILENAME в один прекрасный день возвращает фактическое имя файла, чтобы избежать двойного префикса корня документа.