Apache: Как установить другую корневую папку в зависимости от того, является ли пользователь локальным или из-за пределов сети

#macos #apache

Вопрос:

У меня есть корневой каталог /Users/username/Sites/ , который я использую для локального тестирования сайтов. Я хочу предоставить доступ только к одной из вложенных Users/username/Sites/subsite папок для запросов, поступающих из-за пределов сети.

У меня уже настроена переадресация портов, и я могу видеть корневой каталог при входе в систему из своей службы динамического DNS.

Что мне нужно сделать, чтобы Apache выполнил эту работу? Я пробовал несколько поисков, но, похоже, не могу найти правильную формулировку, чтобы получить ответ на свой вопрос.

Ответ №1:

Вы можете создать (или изменить) a <VirtualHost> в конфигурации сервера, который принимает запросы на «динамическое dns-имя хоста.пример», на который указывает непосредственно Users/username/Sites/subsite .

Например, самым минимальным будет (скопируйте конфигурацию с вашего существующего хоста):

 <VirtualHost *:80>
    ServerName dynamic-dns-hostname.example
    DocumentRoot Users/username/Sites/subsite
    <Directory Users/username/Sites/subsite>
        Options FollowSymLinks
        Require all granted
        AllowOverride All
    </Directory>
</VirtualHost>
 

Это эффективно скрывает имя /subsite каталога от пользователя, поскольку запрос http://dynamic-dns-hostname.example/ указывает непосредственно на подкаталог.

Это только HTTP (порт 80). Если вы разрешаете HTTPS-соединения, вам понадобится другой vHost для порта 443 (по умолчанию) со всей конфигурацией SSL.


В качестве альтернативы вы можете выполнить внешнее перенаправление (или внутреннюю перезапись, если хотите скрыть подкаталог) при доступе Users/username/Sites по любому IP-адресу, который не является локальным IP-адресом.

Например, в вашем основном контейнере vHost (или <Directory /Users/username/Sites> контейнере, или .htaccess файле в /Users/username/Sites/ каталоге) вы можете сделать что-то вроде следующего:

 RewriteEngine On

RewriteCond %{REMOTE_ADDR} !^192.168.
RewriteCond %{REQUEST_URI} !^/[^/] /subsite($|/)
RewriteRule ^/?(.*) /subsite/$1 [R,L]
 

Это предполагает, что локальные IP-адреса начинаются 192.168.


В сторону:

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

Если бы это было так, то это было бы просто вопросом добавления ServerAlias директивы в соответствующий контейнер vHost:

 ServerAlias dynamic-dns-hostname.example