【发布时间】:2011-04-17 00:14:23
【问题描述】:
我正在使用.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
更新
所以我设法为目录创建了过滤器:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !^/~my_user/my_base/$ [NC]
RewriteRule ^(.*)$ 404.php [L]
它的作用是检查请求的路径(REQUEST_FILENAME)是否存在并且它是一个目录AND如果它不是我的RewriteBase基本上是index.php,然后重定向到404.php
我仍在尝试找到对文件执行相同操作的方法。我知道我可以有选择地使用扩展文件名来做到这一点,但我想要一个文件的通用过滤器。
【问题讨论】:
标签: .htaccess mod-rewrite apache2