Назад | Перейти на главную страницу

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.

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/.