#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