Apache Rewrite: каталог изображений на основе HTTP-хоста - PullRequest
5 голосов
/ 05 февраля 2012

Мое программное обеспечение поддерживает несколько доменных имен, каждый из которых указывает на один и тот же каталог на сервере (разная база данных для каждого, конечно).Итак, эти домены ...

www.example1.com
www.example2.com
www.example3.com

... все указывают на ...

/public_html/

В каталоге изображений ...

/public_html/images/

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

/public_html/images/www.example1.com/
/public_html/images/www.example2.com/
/public_html/images/www.example3.com/

Я пытаюсь заставить Apache переписать запросы так, чтобы при прямом просмотре изображения и просмотре адресной строки вы видели только хостназовите один раз.

Итак, запрос на ...

http://www.example1.com/images/book.png

... получен Apache в ...

/public_html/images/www.example1.com/book.png

Одна из вещей, которые яЯ пытался и имел успех в различных обстоятельствах, но это не работает в этой ситуации:

RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Попробуйте добавить следующее в файл .htaccess в корневом каталоге вашего сайта (public_html)

RewriteEngine on
RewriteBase / 

#prevent looping from internal redirects
RewriteCond %{ENV:REDIRECT_STATUS} !200
#only rewrite gif, jpg or png
RewriteRule ^(images)(/.+\.(gif|jpg|png))$ $1/%{HTTP_HOST}$2 [L,NC] 

Ваше правило

RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1

не сработало, потому что у вас естьведущий / до images.В .htaccess ведущий / удаляется, поэтому правило никогда не будет совпадать.

1 голос
/ 06 февраля 2012

Джон,

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

RewriteCond %{HTTP_HOST} ^www\.(host1|host2|host3\.com
RewriteRule ^ -  [E=HOST:%1]

Вы также можете добавить [S] флаги для реализации логики if / then / else в ваших правилах.Также вы можете использовать переменную HOST в следующих строках правила или условия (не в шаблонах регулярных выражений) как% {ENV: HOST}.

Вам также нужно внимательно изучить полный отчет phpinfo (), чтобы понятьиспользуете ли вы хостинговый сервис интерфейс mod_php или mod_suPHP, ... и размещаете ли вы его в режиме DNS с множественной адресацией.Например, мой поставщик устанавливает% {ENV: DOCUMENT_ROOT_REAL}, который мне нужно использовать вместо% {DOCUMENT_ROOT} при проверке файлового пространства.

Все ваши URI, «прибывающие» в DOCROOT /, имеют форму http://www.exampleX.com/images/book.png таким образом, если ваше местоположение .htaccess является вашим DOCROOT, тогда ваша база /.Таким образом, предполагая вышеупомянутую настройку ENV, они должны работать

RewriteBase /

RewriteCond %{HTTP_HOST} ^www\.(host1|host2|host3)\.com
RewriteRule ^ -  [E=HOST:%1]

RewriteCond %{ENV:HOST}==%{REQUEST_URI}  !^(.*?)==/image/\1
RewriteRule ^image/(.*) image/%{ENV:HOST}/$1     [L,NS]  

Конденсатор - это ловушка для остановки цикла перезаписи правила.

Обобщенная версия

Приведенное выше решение является уже обобщенным решением для вас.Просто замените RewriteCond регулярное выражение на любой шаблон, который соответствует вашему собственному соглашению об именах, и я согласен, что если это (. *), То вы можете также отбросить первое правило и заменить %{ENV:HOST} на %{HTTP_HOST}.. Вам нужна защита RewriteCond.чтобы предотвратить цикл, который приводит к 500.

1 голос
/ 06 февраля 2012

Вот одна из вещей, которые я сделал для моей высокопроизводительной платформы (см. Мою биографию).

Я даю вам расширенный RewriteRule, я почти уверен, что у вас будет достаточно материала, чтобы закончить:

Создание статических доменов:

static.example1.com
static.example2.com
static.example3.com

Где будут находиться все ваши изображения.

Отныне не более:

www.example1.com/images/www.example1.com/picture.jpg
www.example2.com/images/www.example2.com/picture.jpg
www.example3.com/images/www.example3.com/picture.jpg

, но

static.example1.com/picture.jpg
static.example2.com/picture.jpg
static.example3.com/picture.jpg

Хорошие URL, а?Теперь создайте vhost со всеми вашими статическими файлами:

<VirtualHost *>
    ServerName static.example1.com
    ServerAlias static.example2.com static.example3.com
</VirtualHost>

Установите корневой каталог вашего документа на базу без имени vhost, поэтому в вашем случае:

DocumentRoot "/public_html/images"

И добавьте этот RewriteRule

RewriteCond %{HTTP_HOST} ^static\.([a-zA-Z0-9\-]+)\.com$
# Change the path, and add the request:
RewriteRule  (.*) %{DOCUMENT_ROOT}/static.%1.com$1 [QSA,L]

В общем:

<VirtualHost *>
    ServerName static.example1.com
    ServerAlias static.example2.com static.example3.com
    RewriteCond %{HTTP_HOST} ^static\.([a-zA-Z0-9\-]+)\.com$
    # Change the path, and add the request:
    RewriteRule  (.*) %{DOCUMENT_ROOT}/static.%1.com$1 [QSA,L]
</VirtualHost>

Хорошо, это не совсем точно отвечает на ваш вопрос, так что вот краткий ответ, но мне это не нравится, потому что этоне поможет вам выполнить очень (очень) хорошую работу:

    RewriteCond %{HTTP_HOST} ^www\.(example1|example2|example3)\.com$
    # Change the path:
    RewriteRule (.*)(\.(css|js|txt|htc|pdf|jpg|jpeg|gif|png|ico))$ %{DOCUMENT_ROOT}/www.%1.com$1$2 [QSA,L]

А если этого недостаточно:

Два совета:

Если выВы не в размещенной среде (= если это ваш собственный сервер и , вы можете изменять виртуальные хосты , а не только .htaccess файлов), попробуйте использовать директиву RewriteLog: она поможет вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...