CakePHP 3 htaccess 忽略目录

CakePHP 3 htaccess ignore directory

经过大量研究,我仍在苦苦挣扎。

我的 ./.htaccess 文件如下所示:

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %{REQUEST_URI} !^/trackparser/.*$

    RewriteRule    ^(\.well-known/.*)$  [L]
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/    [L]
</IfModule>

但是,如果我转到 www.mysite.com/trackparser,它只会给我一个缺少控制器的错误。

如何让它忽略 trackparser 目录?

除了@GregSchmidt 提到的必需 / 之外,重写条件仅适用于跟随它们的第一条规则,因此您的配置基本上说:

IF (URI != ^/trackparser/.*$) {
    RewriteRule ^(\.well-known/.*)$  [L]
}

RewriteRule ^$    webroot/  [L]
RewriteRule (.*) webroot/ [L]

如果 URI 不匹配 ^/trackparser/.*$,您想要的是应用所有三个规则。为此,您可以反转条件并使用跳过规则,该规则在应用时将跳过 N 个后续规则:

RewriteRule ^(\.well-known/.*)$  [L]

RewriteCond %{REQUEST_URI} ^/trackparser(/.*|$)
RewriteRule . - [S=2]

RewriteRule ^$   webroot/   [L]
RewriteRule (.*) webroot/ [L]

如果满足条件,这将跳过 2 CakePHP webroot 规则,所以它基本上是这样做的:

RewriteRule ^(\.well-known/.*)$  [L]

IF (URI != ^/trackparser(/.*|$)) {
    RewriteRule ^$   webroot/   [L]
    RewriteRule (.*) webroot/ [L]
}

请注意删除的否定运算符,以及添加的 (/.*|$) 以使结束斜线可选。理论上也可以跳过 well-known 目录(证书验证)的规则,但我会免除它以避免它由于以后的更改而意外地没有被应用。

另见