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