我配置了以下重定向:
<VirtualHost ...>
<Directory ...>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(myapp/login) https://%{HTTP_HOST}:443/$1 [NC,R=301,L]
但它没有重定向。我该如何排除故障?
答案 0 :(得分:2)
常规调试:如果您可以访问apache配置本身,则可以启用RewriteLog
,根据您设置的级别,可以为您提供匹配,当前值的逐步细分,和改动。
这里发生的是整个host
上下文中的网址匹配(仅在apache的配置文件中可用)或.htaccess
上下文的每个目录中存在差异:
匹配什么?
在 VirtualHost 上下文中,模式最初将匹配主机名和端口之后的URL部分,以及查询字符串之前(例如“/app1/index.html”) “)。
在目录和htaccess上下文中,在删除引导服务器到当前RewriteRule的前缀之后,模块最初将与文件系统路径匹配(例如“app1 / index”。 html“或”index.html“取决于定义指令的位置。”
两者之间的区别在于,在VirtualHost
上下文中,您在/
上下文中有一个前导.htcaccess
(网上的大多数示例都假设因为它更容易获得)没有领先/
。
简而言之,这可行,但不适用于.htaccess
:
^/(myapp/login)
如果您想在两种情境中都匹配,请将前导/
设为可选:
^/?(myapp/login)
答案 1 :(得分:1)
对我来说,以下代码有效(我认为这与!=(如@jason所说)和端口的组合有关。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(myapp/login) https://%{HTTP_HOST}/$1 [R=301,L,NC]
答案 2 :(得分:0)
我认为否定字典平等操作符可能存在一些问题。我无法在mod_rewrite文档或其他地方找到任何禁止此内容的内容,但我也没有看到使用!=
的示例。事实上,文档表明它应该可以工作,但你可能会尝试匹配“关闭”而不是“不开启”,如下所示:
RewriteCond %{HTTPS} off
如果是这种情况,使用常规方法(例如,使用RewriteLog
)进行故障排除将非常困难。