htaccess для перенаправления в подкаталог на основе имени хоста - PullRequest
1 голос
/ 26 января 2011

Вопрос:

Какой набор правил мне необходим для следующих перенаправлений:

[1] http://www.xyzblog.com/foo/bar.php  => htdocs/projects/xyzblog/foo/bar.php
[2] http://www.xyzblog.com/js/jquery-min.js => htdocs/js/jquery-min.js

[3] http://www.bigcommerce.ch/images/baz.png => htdocs/projects/bigcommerce/images/baz.png
[4] http://www.bigcommerce.ch/css/reset.css => htdocs/css/reset.css

В [2] и [4] запрошенный файл существуетв исходном пути, поэтому перенаправление не происходит.

Справочная информация:

У меня есть WAMP envo, который использует превосходный XAMPP от Apache Friend.Я работаю над несколькими проектами для разных клиентов и настроил следующую структуру каталогов:

htdocs
  + css
  + images
  + includes
  + js
  + projects
     + bigcommerce
     + xyzblog
     ...

Когда я начинаю работать над новым проектом, я создаю каталог с тем же именем в проектах;более того, я называю проект именем хоста клиента.Поэтому, если я начну работать над проектом, где производственный сайт будет http://www.dreamvacation.com, я добавлю каталог dreamvacation в каталог проектов.

Наконец я временно добавлю следующую строку в мой hosts файл в C:\WINDOWS\system32\drivers\etc

127.0.0.1   dreamvacation.com

Таким образом, все запросы к dreamvacation.com будут коротко переданы моему локальному хосту.

Мне все еще нужен один компонент, чтобы иметь возможность кодировать на localhost иожидайте, что он будет вести себя так же при загрузке на рабочий сервер.Это файл htaccess, позволяющий проверить, какое имя хоста содержится в запросе, и перенаправить в каталог с таким же именем, кроме идентификатора верхнего домена (.com, .net и т. Д.).Перенаправление должно происходить только в том случае, если запрошенный файл не существует.Это последнее условие возникает потому, что я размещаю часто используемые файлы в каталогах под htdocs - например, у меня есть только один jquery-min.js в htdocs/js и только один чертеж css в htdocs/css/blueprint/screen.css.Однако в каждом проекте также есть подкаталог js, css, ..., но только для файлов проекта.

Как этого достичь?

1 Ответ

2 голосов
/ 26 января 2011

Вам, безусловно, стоит взглянуть на именованных виртуальных хостов . Запуск корневого каталога на каждом клиентском каталоге. Это реальное решение: -)

Для ваших общих загрузчиков вы можете использовать инструкции " Alias ​​" в этом Virtualhost, чтобы некоторые каталоги всегда предназначались для одних и тех же мест в дереве каталогов. и используйте ссылки для обмена общими папками.

В любом случае, вы можете делать и по-своему. Это то, что используется для массового виртуального хостинга , где написание тысяч виртуальных хостов - это боль, mode_rewrite - хорошее решение для замены.

Чтобы обнаружить существующие файлы и каталоги, вы можете использовать директивы RewriteCond и предотвратить перезапись, если файл существует. Затем при перезаписи real необходимо повторно использовать переменную apache %{HTTP_HOST}. Итак, я не тестировал его, но что-то подобное должно быть хорошей отправной точкой (для отладки нужно использовать RewriteLogLevel и RewriteLog):

RewriteEngine On
RewriteBase /
RewriteCond   %{REQUEST_FILENAME} !-f
RewriteCond   %{REQUEST_FILENAME} !-d
RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.com$
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
RewriteRule   ^www\.([^.]+)\.com(.*) /htdocs/projects/$1$2

Это на основе примеров документации Apache для доменов на основе имен пользователей, вам нужно проверить на этой странице документации Apache для "Mass Virtual Hosting" для получения более подробной информации, но некоторые из примеров включают основанные на файлах правила и проверки, которые вам не нужны в вашем dev env. Помните, что использование VirtualHosts без mod_rewrite, безусловно, проще, но mod_rewrite может делать абсолютно все, если хотите.

...