Назад | Перейти на главную страницу

Виртуальный хост в подкаталоге

Я работаю над веб-проектом, и есть требование, чтобы он хорошо работал в верхнем домене, а также в путях домена + каталога, например:

www.myDomain.com
www.myDomain.com/somedir/myproject/

Проект хорошо справляется с включаемыми файлами,

Но я не могу настроить свои VHosts для проверки второго случая www.myDomain.com/somedir/myproject/

Моя текущая настройка максимально проста:

хозяева

127.0.0.1       www.myDomain.com

httpd-vhosts.conf

NameVirtualHost *:80
<Directory C:/Projects>
  Order Deny,Allow
  Allow from all
</Directory>

<VirtualHost *:80>
  DocumentRoot C:\wamp\www
  ServerName localhost
</VirtualHost>   

<VirtualHost *:80>
    DocumentRoot "C:\Projects\MyProject\public_html"
    ServerName  "www.myDomain.com"
</VirtualHost>

#@ToDo make this work ...
#<VirtualHost *:80>
#    DocumentRoot "C:\Projects\MyProject\public_html"
#    ServerName  "www.myDomain.com/somedir/myproject/"
#</VirtualHost>

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php [NC,L]

Могу ли я сделать это только с виртуальным хостом? Как лучше всего выполнить эту настройку на локальном компьютере?

Вам нужен псевдоним, а не vhost. Виртуальные хосты работают с именами хостов, а не с именем хоста + каталог.

<VirtualHost *:80>
  DocumentRoot "C:\Projects\MyProject\public_html"
  ServerName  "www.myDomain.com"

  Alias /somedir/myproject  "C:\Projects\MyProject\public_html"
</VirtualHost>

Редактировать:

Проблема OP выглядит несколько иначе, и его решение состоит в том, чтобы отправить все, что не является фактическим физическим файлом, в index.php, используя RewriteRule в файле .htaccess. Это работает, но размещение их в вашем httpd.conf (или в одном из включенных файлов) более эффективно.

Есть один способ легко перенести рабочие правила RewriteRules из .htaccess в httpd.conf без их изменения: использовать контейнеры.

Поэтому, если у вас есть .htaccess, например, в / var / www / myproject, вы можете перейти к httpd.conf следующим образом.

<Directory /var/www/myproject>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php [NC,L]
</directory>

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