htaccess - разрешить просмотр index.html через www.example.com/foo вместо www.example.com/foo/index.html.
Итак, у меня есть гипотетическая папка на моем сайте, защищенная Deny from all
на моем .htaccess
файл. Я кодировал исключение, как показано ниже:
<files index.html>
order allow,deny
Allow from all
</files>
Если пользователь вводит www.example.com/path/index.html
они могут видеть веб-страницу просто отлично. Тем не менее, если они используют более "удобный" подход и тип www.example.com/path
им дают 403 Forbidden
ошибка. Поскольку оба пути обращаются к одному и тому же файлу, я не вижу, как один будет работать, а другой - нет. В каталоге нет других индексных файлов, которые могли бы потенциально помешать index.html
, Есть ли способ настроить .htaccess
таким образом, что позволяет этот второй путь? Любое решение приемлемо, в том числе за пределами области .htaccess
; да у меня есть PHP, нет у меня нет AJAX.
2 ответа
Когда вы указываете только пустой каталог, mod_dir выдает внутренний подзапрос для DirectoryIndex (который, я предполагаю, настроен для обслуживания index.html
в твоем случае). "Проблема" в том, что <Files>
Директива сначала обрабатывается перед выполнением подзапроса. Но перед этим подзапросом возникает имя файла, <Files>
директивные матчи против еще не решены; это пусто! Итак, нам нужно сопоставить пустое имя файла.
Тем не менее, однажды подзапрос для index.html
(DirectoryIndex) произошло тогда <Files>
контейнер перерабатывается (в .htaccess
контекст), но на этот раз имя файла разрешено index.html
, Итак, нам нужно сопоставить с index.html
также!
Это можно объяснить наличием двух <Files>
контейнеры. Например:
<Files "">
Order allow,deny
Allow from all
</Files>
<Files "index.html">
Order allow,deny
Allow from all
</Files>
Или (желательно) объединить их в один <FilesMatch>
контейнер (который принимает регулярное выражение в качестве аргумента). Например:
<FilesMatch ^(index\.html)?$>
Order allow,deny
Allow from all
</Files>
Делая имя файла необязательным (конечный ?
) это эффективно соответствует обоим проходам: пустое имя файла и index.html
,
Обратите внимание, что если оба URL /
а также /index.html
доступны и обслуживают один и тот же контент, тогда вам следует каким-то образом канонизировать URL-адрес, чтобы избежать потенциальных проблем с дублированием контента. (Предпочтительно перенаправление с /index.html
в /
.)
... и введите
www.example.com/path
Просто чтобы уточнить, если пользователь вводит www.example.com/path
, где path
является каталогом файловой системы, а в URL-адресе отсутствует косая черта, тогда mod_dir (по умолчанию) выдаст внешнее перенаправление 301 на www.example.com/path/
(с косой чертой), чтобы "исправить" URL. Таким образом, URL, с которым мы имеем дело, действительно www.example.com/path/
,
https://httpd.apache.org/docs/2.4/mod/mod_dir.html
"Директива DirectoryIndex устанавливает список ресурсов для поиска, когда клиент запрашивает индекс каталога, указав / в конце имени каталога..."
# Example A: Set index.html as an index page, then add index.php to that list as well.
<Directory "/foo">
DirectoryIndex index.html
DirectoryIndex index.php
</Directory>
# Example B: This is identical to example A, except it's done with a single directive.
<Directory "/foo">
DirectoryIndex index.html index.php
</Directory>
# Example C: To replace the list, you must explicitly reset it first:
# In this example, only index.php will remain as an index resource.
<Directory "/foo">
DirectoryIndex index.html
DirectoryIndex disabled
DirectoryIndex index.php
</Directory>`