Запретить прямой доступ к файлам или каталогам с помощью .htaccess - PullRequest
4 голосов
/ 25 сентября 2010

Я играю с .htaccess, и мне было интересно, можно ли с помощью только .htaccess в корневом каталоге заблокировать все запросы браузера, направленные на существующие файлы или каталоги.

Давайте попробуем этот пример:

RewriteEngine On

RewriteBase /~my_user/my_base/

RewriteRule ^list/$ list.php [L]
RewriteRule ^element_of_list/([a-zA-Z0-9\-]+)/$ element.php?elem_id=$1 [L]

Теперь, если я напишу http://127.0.0.1/~my_user/my_base/list/, это нормально, но если я напишу http://127.0.0.1/~my_user/my_base/list.php, это все еще работает. Я не хочу этого Я хочу, чтобы пользователь получил ошибку 404 в последнем случае.

У нас есть /etc/apache2/mods-enabled/userdir.conf

<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                AllowOverride All
                Options Indexes FollowSymLinks
                <Limit GET POST OPTIONS>
                        Order allow,deny
                        Allow from all
                </Limit>
                <LimitExcept GET POST OPTIONS>
                        Order deny,allow
                        Deny from all
                </LimitExcept>
        </Directory>
</IfModule>

Моей первой попыткой было использование RewriteCond:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ 404.php [L]

Но это не работает. Каждый запрос перенаправляется на 404.php

UPDATE

Итак, мне удалось создать фильтр для каталогов:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/~my_user/my_base/$ [NC]
RewriteRule ^(.*)$ 404.php [L]

Что нужно сделать, это проверить, существует ли запрошенный путь (REQUEST_FILENAME) и является ли он каталогом И , если это не мой RewriteBase, который в основном index.php, а затем перенаправить на 404.php

Я все еще пытаюсь найти что-то, что делает то же самое для файлов. Я знаю, что могу выборочно сделать это, используя расширения имени файла, но я хочу универсальный фильтр для файлов.

Ответы [ 2 ]

10 голосов
/ 26 сентября 2010

Если я правильно понял ваши требования, вы собираетесь сделать что-то вроде этого:

# This is a real directory...
RewriteCond %{REQUEST_FILENAME} -f [OR]
# Or it's a real file...
RewriteCond %{REQUEST_FILENAME} -d
# And it's not 404.php...
RewriteCond $0 !=404.php
# And it's not the root
RewriteCond $0 !=""
# And it's not any of the above due to an internal redirect...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# So cause a 404 response (you could redirect to 404.php if you want)
RewriteRule ^.*$ - [R=404,L]

# Set the 404 error document
ErrorDocument 404 /~my_user/my_base/404.php

Имейте в виду, что это блокирует все , что существует, поэтому любые изображения, таблицы стилей или сценарии будут также отправляться на страницу 404. Если вы просто хотите заблокировать доступ к PHP-файлам, решение Gumbo является более подходящим. Я думаю, что в этом случае вам понадобится еще один RewriteCond, чтобы предотвратить зацикливание:

# Make sure the reason this request has a .php is because it was requested
# by the user (and not due to a redirect)
RewriteCond %{THE_REQUEST} ^[A-Z]+\s/[^\s]+\.php
# Make sure we aren't on 404.php already
RewriteRule %{REQUEST_URI} !404\.php$
# We aren't, so redirect to 404.php
RewriteRule ^ 404.php [L]
2 голосов
/ 25 сентября 2010

Попробуйте это правило:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^?\ ]*\.php[/?\ ]
RewriteRule .*\.php$ 404.php [L]

Это перезапишет все запросы, чьи пути содержат внутренне .php, в 404.php .

...