我正在使用CodeIgniter,我在.htaccess中添加了一些规则,将所有请求重定向到index.php / a / b到/ a / b 这些是规则:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
我想在apache中禁用目录列表,所以我添加了以下规则:
Options -Indexes
问题在于,一旦我添加了此规则,它就会禁用目录列表,但也会将对特定文件夹(不包含索引。 * 文件)的任何调用重定向到CodeIgniter控制器(哪个不存在,并生成404错误。)
之前:访问/ X文件夹将返回目录列表
之后:访问/ X文件夹会静默调用index.php / X并返回404错误。
我希望任何对/ X及其中任何子文件夹的访问只返回403禁止错误(或任何不涉及运行php脚本的错误),而不是调用index.php / X(我想要用户能够访问/ X及其子文件夹中的文件,但不允许用户查看/ X及其子文件夹的目录列表。
我尝试过但没有成功:
<Directory "/X">
规则。看起来我不能在我的.htaccess RewriteCond $1 !^(X.*|/X.*)
之前添加RewriteRule ^(.*)$ index.php/$1 [L]
规则(见上文)。它似乎不起作用。我应该在.htaccess中写什么来解决这个问题?
答案 0 :(得分:1)
要排除以/X
开头的任何文件夹,请使用下面添加的#1 ReWriteCond
。
要为/X
和子目录返回403,请取消注释#1后面的两行,并注释#2后面的行。订单很重要,因此如果您希望它起作用,必须先遵守此规则
RewriteEngine On
RewriteBase /
#1 to return a 403, for /X, uncomment these 2 lines
#RewriteCond %{REQUEST_URI} ^/X [NC]
#RewriteRule . - [L,F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#2 exclude any folder starting with X
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ /X [NC]
RewriteRule ^(.*)$ index.php/$1 [L]
答案 1 :(得分:0)
您不能在.htaccess中使用<Directory /X>
因为.htaccess是<Directory>
指令,在apache编译配置之外导出,并在运行时检查每个请求。是的.htaccess很糟糕并且执行速度很慢,但这也意味着你可以删除所有.htaccess并用apache配置文件中的正确<Directory>
替换它,如果你有权访问这些文件的话。
现在你的问题了。您希望检测到目录/X
的直接访问,并为其发送http错误代码。要将此规则扩展到不包含index.php文件的所有目录/foo
或/foo/bar
,我只需编写:
# detect requested url IS a directory
RewriteCond %{REQUEST_FILENAME} -d
# detect the requested directory does not contain an index.php file
RewriteCond %{REQUEST_FILENAME}index.php !-f
# then bail out
RewriteRule ^(.*)$ - [R=403,L]