RewriteCond "except for directory" 在复杂规则集中失败

RewriteCond "except for directory" failing in complex rule set

我需要强制 除 IE8 之外的所有内容 到 HTTPS 和 IE8 专门到 HTTP (这是暂时的 - 因此是 302 - 它很愚蠢,但有合法的商业原因)。

我希望所有这些都忽略 /api/ 目录,因为不幸的是,利用这些目录的应用程序不遵循重定向。

以下正在运行,IE8检测正在运行。一切都是 除了 /api/whatever 仍在重定向。

我非常感谢任何建议或解释为什么这不起作用。

# make sure mod_rewrite is ON
    RewriteEngine On

# force staging and live to SSL
    RewriteCond %{HTTPS} !=on
    # Unless its IE 8
    RewriteCond %{HTTP_USER_AGENT} !compatible;\sMSIE\s8\.0 [NC]
    RewriteCond %{HTTP_HOST} ^(www\.|staging\.)?example\.com [NC]
    # Skip the API
    RewriteCond %{REQUEST_URI} !^/api/.*
    # 301 Permanent
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

# force IE8 to Non-SSL
    RewriteCond %{HTTPS} on
    RewriteCond %{HTTP_USER_AGENT} compatible;\sMSIE\s8\.0 [NC]
    RewriteCond %{HTTP_HOST} ^(www\.|staging\.)?example\.com [NC]
    # Skip the API
    RewriteCond %{REQUEST_URI} !^/api/.*
    # 302 Temporary
    RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [L,R=302]

没有发现任何错误,但假设您已经清除了浏览器的缓存,您可以尝试不同的方法并在规则列表的顶部包含一个显式传递:

RewriteRule ^api/ - [L]

您可以在 RewriteEngine On 下添加它并摆脱 /api 条件。

RewriteCond %{REQUEST_URI} !^/api/.* 工作正常,问题是后来通过前端控制器重写了所有路由 /index.php 导致 htaccess 重新解析。

将规则更改为 RewriteCond %{REQUEST_URI} !^(/api/|/index.php) 解决了问题。前端控制器 index.php 无论如何都不能直接调用,所以这不是问题。