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>`
Другие вопросы по тегам