Использование mod-rewrite для условного выбора существующего файла в подкаталоге на основе заголовка Host? - PullRequest
0 голосов
/ 20 апреля 2010

Я работаю над проблемой, когда хочу выбрать другой файл статического содержимого на основе входящего заголовка узла. Простой пример - это сопоставление 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]

1 Ответ

2 голосов
/ 20 апреля 2010

Попробуйте это правило:

RewriteCond %{HTTP_HOST} ^(skin\d+)\.example\.com$
RewriteCond %{DOCUMENT_ROOT}$1/%1/$2 -f
RewriteRule ^([^/]+)/([^/]+)$ $1/%1/$2 [L]
...