RewriteCond“除了目录”在复杂规则集中失败

时间:2015-03-11 22:08:01

标签: apache .htaccess mod-rewrite internet-explorer-8

我需要强制一切除了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]

2 个答案:

答案 0 :(得分:0)

看不出有什么不妥,虽然假设你已经清除了浏览器的缓存,但你可以尝试一种不同的方法,并在规则列表的顶部包含一个明确的传递:

RewriteRule ^api/ - [L]

您可以在RewriteEngine On下添加该权利,并摆脱/api条件。

答案 1 :(得分:0)

RewriteCond %{REQUEST_URI} !^/api/.*正在运行,问题是后来通过前端控制器/index.php重写路由导致htaccess重新分析。

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