htaccess mod_rewrite重定向到CodeIgniter控制器而不是子文件夹

时间:2012-01-15 14:06:13

标签: .htaccess codeigniter mod-rewrite codeigniter-url

我正在使用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中写什么来解决这个问题?

2 个答案:

答案 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]