Я работаю над проблемой, когда хочу выбрать другой файл статического содержимого на основе входящего заголовка узла. Простой пример - это сопоставление URL-адресов с такими файлами:
- www.example.com / images / logo.gif -> \ images \ logo.gif
- skin2.example.com / images / logo.gif -> \ images \ skin2 \ logo.gif
- skin3.example.com / images / logo.gif -> \ images \ skin3 \ logo.gif
У меня это работает со следующими RewriteRules, но мне не нравится, как я должен повторяться так много. Каждый хост имеет одинаковый набор правил, и каждый RewriteCond и RewriteRule имеет одинаковый путь. Я хотел бы использовать RewriteMap , но я не знаю, как его использовать для сопоставления% {HTTP_HOST} с путем.
<VirtualHost *:80>
DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"
ServerName www.example.com
ServerAlias skin2.example.com
ServerAlias skin3.example.com
RewriteEngine On
RewriteCond %{HTTP_HOST} skin2.example.com
RewriteCond %{DOCUMENT_ROOT}$1/skin2/$2 -f
RewriteRule ^(.*)/(.*) $1/skin2/$2 [L]
RewriteCond %{HTTP_HOST} skin3.example.com
RewriteCond %{DOCUMENT_ROOT}$1/skin3/$2 -f
RewriteRule ^(.*)/(.*) $1/skin3/$2 [L]
</VirtualHost>
Концепция, лежащая в основе правил, заключается в том, что если в подкаталоге этого хоста существует одно и то же имя файла, используйте его вместо файла с прямым таргетингом. При этом используются основанные на хосте подкаталоги на самом низком уровне, а не подкаталог верхнего уровня для разделения содержимого.
Обновление:
Я хочу пересмотреть вопрос, предполагая, что имя хоста не совпадает точно с подкаталогом, но существует как карта 1-1. Вот пересмотренный URL для сопоставления файлов.
- www.example.com / images / logo.gif -> \ images \ logo.gif
- skin2.example.com / images / logo.gif -> \ images \ s2 \ logo.gif
- skin3.example.com / images / logo.gif -> \ images \ s3 \ logo.gif
Для использования с RewriteMap , я создал этот файл данных:
## hostmap.txt -- hostname to subdirectory map
skin2.example.com s2 # map skin2 to s2 directory
skin3.example.com s3 # map skin2 to s3 directory
И изменил RewriteRules на использование% {HTTP_HOST} непосредственно в вызове карты, который, кажется, работает.
RewriteEngine On
RewriteMap hostmap txt:conf/hostmap.txt
RewriteCond %{DOCUMENT_ROOT}$1/${hostmap:%{HTTP_HOST}}/$2 -f
RewriteRule ^(.*)/(.*) $1/${hostmap:%{HTTP_HOST}}/$2 [L]