Apache: виртуальный хост и перезапись URL-адресов внутри httpd.conf для Kohana Framework - PullRequest
0 голосов
/ 30 ноября 2010

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

Мой 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>

В Kohana каждый 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>

Что я делаю не так? Помощь будет оценена!

Ответы [ 4 ]

3 голосов
/ 25 июля 2013

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

Цитирование с указанной выше страницы:

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

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

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

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

2 голосов
/ 30 ноября 2010

У вас нет RewriteBase в вашем httpd.conf. А что не так с .htaccess?

1 голос
/ 20 октября 2011

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

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

1 голос
/ 08 марта 2011

это может быть опечатка (может быть, это 'приложение'):

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