2012-07-02 3 views
0

Я все время пытался понять это. Прошу прощения, если это повторяющийся вопрос, но я не могу найти подходящее решение.Apache Mod_rewrite для изменения каталогов

То, что я пытаюсь выполнить следующие действия:

Учитывая URL dev-<sub>.example.com/resources/path/to/resource, где sub меняется, перейдите к /var/www/devEx_<sub>/override/resources/path/to/resource, если он дает файл или /var/www/devEx_<sub>/main/resources/path/to/resource в противном случае (я могу справиться с 404-х).

Я могу найти решение, в котором я вручную добавляю каждого человека sub, но я не могу понять, как это сделать с помощью подстановочного знака или обратной ссылки.

Я пробовал общаться с VirtualDocumentRoot, но я никогда не смогу получить часть devEx_<sub> для отображения в DOCUMENT_ROOT для проверки ресурса.

Я попытался использовать решение, подобное этому [mod_rewrite regex (too many redirects)], но оно всегда беспорядочно с REQUEST_URI.

Я пытался использовать что-то подобное в прошлом:

RewriteCond $1 (^resources/.*) 
RewriteCond %{DOCUMENT_ROOT}/override%{REQUEST_URI} -f 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/override%{REQUEST_URI} [QSA,L] 

RewriteCond $1 (^resources/.*) 
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/main%{REQUEST_URI} [QSA,L] 

Кроме того, я бы очень хотелось, чтобы понять, используя Apache/mod_rewrite более, если у вас есть предложения для хорошего технического руководства или учебника, который помогли бы мне с этим или некоторыми методами отладки (поскольку я не знаю, как отлаживать эти правила перезаписи), я бы очень признателен за знание, поэтому, пожалуйста, поделитесь!

EDIT

Некоторые подробности о моих исследованиях.

В моем решении VirtualDocumentRoot я смог перейти в нужный каталог, но не смог установить каталог в качестве корня документа для выполнения правил переопределения.

Для этого решения [mod_rewrite regex (too many redirects)], я поставил DocumentRoot в конф быть /var/www и помещены следующие строки в .htaccess файл в каталоге

RewriteCond %{HTTP_HOST} ^dev-([^.]+)\.example\.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/devEx_%1 -d 
RewriteCond %{ENV:REDIRECT_STATUS} ="" 
RewriteRule .* /devEx_%1/$0 [L] 

Однако это добавляется devEx_<sub> к %{REQUEST_URI}, а вы ожидаете.

+0

Эти правила, похоже, находятся в правильном направлении - разве они не работают? – Ansari

+0

Не хотите ли '% {DOCUMENT_ROOT}/path1% {REQUEST_URI}' быть '% {DOCUMENT_ROOT}/переопределить% {REQUEST_URI}'? –

+0

@Jon Отредактирована ошибка в переводе. – sgcharlie

ответ

0

Почему вы не сделать ваш документ корень/вар/WWW/

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

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/devEx_%1/override%{REQUEST_URI} -f 
RewriteRule ^(.*)$ /devEx_%1/override%{REQUEST_URI} [QSA,L] 

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC] 
RewriteRule ^(.*)$ /devEx_%1/main%{REQUEST_URI} [QSA,L] 

В качестве альтернативы, можно заменить экземпляр %{DOCUMENT_ROOT}/var/www с, хотя это вроде некрасиво, особенно если перенести сайт в другом месте или изменить конфигурации сервера. Таким образом, вы получите примерно следующее:

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ [NC] 
RewriteCond /var/www/devEx_%1/override%{REQUEST_URI} -f 
RewriteRule ^(.*)$ /var/www/devEx_%1/override%{REQUEST_URI} [QSA,L] 

RewriteCond $1 (^resources/.*) 
RewriteCond %{HTTP_HOST} ^dev-(.*)\.example.com$ 
RewriteRule ^(.*)$ /var/www/devEx_%1/main%{REQUEST_URI} [QSA,L] 
+0

В файле '/ var/www/devEx_ ' есть еще один файл .htaccess, который нужно выполнить, чтобы выполнить дополнительную переписывание. Есть ли способ вызвать этот файл .htaccess, не входя в переменную '% {REQUEST_URI}? – sgcharlie

+0

@sgcharlie В первом случае при изменении корня документа на '/ var/www /' no переписывание всегда будет модификацией '% {REQUEST_URI}', во втором, где '/ var/www /' жестко запрограммирован, '% {REQUEST_URI} 'не изменяется. –

+0

Правильно, ваши примеры не изменяют переменную '% {REQUEST_URI}'. Я просто задаюсь вопросом, есть ли способ вызвать '/ var/www/devEx_/.htaccess' в дополнение к одному из этих двух списков правил без добавления' devEx_ 'в начало'% {REQUEST_URI} ', если это имеет смысл. – sgcharlie