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 无论如何都不能直接调用,所以这不是问题。
我需要强制 除 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 无论如何都不能直接调用,所以这不是问题。