Как обслуживать различный контент с помощью 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.

Есть идеи?

1
задан 7 December 2017 в 03:15
1 ответ

Вы можете создать 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 Hash File (или 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...
1
ответ дан 3 December 2019 в 23:22

Теги

Похожие вопросы