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