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

.htaccess htaccess mod_rewrite重定向到CodeIgniter控制器,而不是子文件夹,.htaccess,codeigniter,mod-rewrite,codeigniter-url,.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,并在.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错误)

之前:访问a/X文件夹将返回目录列表

After:访问a/X文件夹将以静默方式调用index.php/X并返回404错误

我希望对/X及其子文件夹的任何访问只返回403禁止的错误(或不涉及运行php脚本的任何错误),而不是调用index.php/X(我希望用户能够访问/X及其子文件夹中的文件,但不允许用户查看/X及其子文件夹的目录列表)

我尝试过,但没有成功:

  • 添加
    规则。看起来我无法在.htaccess中使用它
  • 添加
    RewriteCond$1^(X.*/X.*)
    重写规则之前的规则^(.*)$index.php/$1[L](见上文)。它似乎不起作用

要解决此问题,我应该在.htaccess中写入什么?

要排除任何以
/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]
不能在.htaccess中使用
,因为.htaccess是一条
指令,在apache编译配置之外导出,并在运行时检查每个请求。是的.htaccess不好,执行速度非常慢,但这也意味着您可以删除所有.htaccess,并用apache配置文件中正确的
内容替换它(如果您有权访问此类文件)

现在是你的问题。您希望检测对目录的directaccess,
/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]

RewriteCond$1^X
应该可以工作,我设法让它工作。正确的答案在你的答案中,但你必须纠正它。只需要以下规则:
RewriteCond%{REQUEST\u FILENAME}-f RewriteCond%{REQUEST_FILENAME}-重写cond%{u请求}^[A-Z]{3,9}\/X[NC]重写规则^(.*)$index.php/$1[L]
。此外,还需要在此规则中添加一个表示否定的感叹号:
RewriteCond%{THE_REQUEST}^[A-Z]{3,9}\/X[NC]
@EugenVarzaru您是对的,我缺少了
并已修复它。谢谢