Я пытаюсь запретить доступ к корневому каталогу, одновременно разрешая доступ к определенным файлам (заканчивающимся на .html и .js) и указывая DirectoryIndex, чтобы запросы каталога отвечали страницей по умолчанию.
Проверил уже эти вещи:
-Apache / 2.2.14 может читать корень своего каталога.
-Файл DocumentRoot существует.
-Нет других настроек каталога, которые настраивают тот же каталог
Вот одна из наиболее явных конфигураций, которые я пробовал.
<VirtualHost *:80>
ServerName myserver.com
DocumentRoot /var/www/client
DirectoryIndex app.html
<Directory /var/www/client>
AllowOverride None
Options +Indexes
Order Allow,Deny
Deny from all
<Files ~ "\.(js|html)$">
Order Deny,Allow
Allow from all
</Files>
</Directory>
</VirtualHost>
Выдает 403. Я попробовал несколько вариантов, пытаясь указать директивы настолько ясно, насколько я знал, как это сделать. Я попытался allow from all
в каталоге, чтобы доказать, что нет конфликтующих правил и DirectoryIndex работает должным образом (обслуживается app.html). С приведенной выше конфигурацией я могу получить /app.html, но он не будет использоваться по умолчанию для запросов к «/».
Именно это я и сделал, чтобы добиться желаемого эффекта.
<VirtualHost 127.0.0.0:80>
ServerName example.com
DocumentRoot /var/www/client
AliasMatch ^/$ /var/www/client/app.html
<Directory /var/www/client>
AllowOverride None
Order Allow,Deny
Deny from all
<Files ~ "\.(js|html)$">
Order Deny,Allow
Allow from all
</Files>
</Directory>
<VirtualHost>
Есть ли лучший способ достичь моей цели? DirectoryIndex не работает с?
Использование AliasMatch - хороший способ добиться желаемого.
Причина, по которой DirectoryIndex не дает вам того, что вы хотите, заключается в том, что Files
Директива смотрит на запрос, сделанный браузером, и этот запрос не содержит .html или .js. В AliasMatch
директива гарантирует, что запрос будет перезаписан до достижения Files
директива, но DirectoryIndex не происходит в надлежащем контексте, чтобы он был пойман Files
директива.