Итак, у меня на сайте есть гипотетическая папка, защищенная 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.
https://httpd.apache.org/docs/2.4/mod/mod_dir.html#directoryindex
«Директива 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>`
Когда вы указываете только чистый каталог, mod_dir выдает внутренний подзапрос для DirectoryIndex (который, как я полагаю, настроен для обслуживания index.html
в твоем случае). «Проблема» в том, что <Files>
директива сначала обрабатывается перед возникает подзапрос. Но перед этим подзапросом появляется имя файла, <Files>
директива сопоставления еще не решена; он пуст! Итак, нам нужно сопоставить пустой имя файла.
Однако, как только подзапрос для index.html
(DirectoryIndex), то <Files>
контейнер перерабатывается (в .htaccess
context), но на этот раз имя файла разрешено 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/
.