Назад | Перейти на главную страницу

Как обслуживать различный контент с помощью apache и (возможно) mod_rewrite

В такой структуре каталогов есть несколько файлов (с уникальными именами):

/var/www/domain1/unique_filename1
/var/www/domain2/unique_filename2
/var/www/domain3/unique_filename3

На данный момент все каталоги домена доступны как подкаталоги главного домена, и клиенты могут получать доступ к файлам, используя следующие URI:

www.my-master-domain.com/domain1/unique_filename1
www.my-master-domain.com/domain2/unique_filename2
www.my-master-domain.com/domain3/unique_filename3

Я хотел бы изменить конфигурацию Apache 2.4, чтобы я мог получать доступ к файлам без упоминания дополнительных доменов в своих URL-адресах, например:

www.my-master-domain.com/unique_filename1
www.my-master-domain.com/unique_filename2
www.my-master-domain.com/unique_filename3

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

Любые идеи?

Вы могли бы создать RewriteMap который сопоставляет "уникальные" имена файлов домен он хранится под. Затем вы можете использовать RewriteRule директива для поиска домен из запрошенного "уникального" имени файла и внутренне переписать запрос.

Например, в конфигурации вашего сервера определите RewriteMap:

RewriteMap fn2domain "txt:/var/www/filename-to-domain-map.txt"

Затем в /var/www/filename-to-domain-map.txt вы должны включить все свои сопоставления файлов:

# Filename to Domain map
unique_filename1 domain1
unique_filename2 domain2
unique_filename3 domain3

Теперь вы можете использовать mod_rewrite для ссылки на эту карту, чтобы внутренне переписать запрос от /unique_filename2 к /domain2/unique_filename2 (например).

RewriteEngine On
RewriteRule ^/([^/]+)$ /${fn2domain:$1}/$1 [L]

Это предполагает, что "unique_filename" - именно это; просто имя файла. Дополнительного URL-пути нет.

Вы можете сделать поиск более эффективным, используя dbm: Хеш-файл DBM (или fastdbd: SQL Query?) Вместо обычного текстового файла, если у вас много «имен файлов».

Ссылка:
https://httpd.apache.org/docs/2.4/rewrite/rewritemap.html


В качестве альтернативы вы можете выполнить проверку файловой системы на наличие "unique_filename" в каждом домен подкаталог. Побеждает первый матч. это мощь Хорошо, если у вас есть только 2 или 3 подкаталога домена, но если у вас их много, это может стать проблемой с производительностью, поскольку проверки файловой системы относительно дороги. Например, снова используя mod_rewrite:

RewriteEngine On

# Is it in domain1? Then rewrite to domain1 subdirectory
RewriteRule %{DOCUMENT_ROOT}/domain1/$1 -f
RewriteRule ^/([^/]+)$ /domain1/$1 [L]

# Is it in domain2? Then rewrite to domain2 subdirectory
RewriteRule %{DOCUMENT_ROOT}/domain2/$1 -f
RewriteRule ^/([^/]+)$ /domain2/$1 [L]

# Is it in domain3? Then rewrite to domain3 subdirectory
RewriteRule %{DOCUMENT_ROOT}/domain3/$1 -f
RewriteRule ^/([^/]+)$ /domain3/$1 [L]

# Repeat for each domain...