工作,我配置了以下重定向:不重定向在Apache中
<VirtualHost ...>
<Directory ...>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(myapp/login) https://%{HTTP_HOST}:443/$1 [NC,R=301,L]
但它不重定向。我如何解决它?
工作,我配置了以下重定向:不重定向在Apache中
<VirtualHost ...>
<Directory ...>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(myapp/login) https://%{HTTP_HOST}:443/$1 [NC,R=301,L]
但它不重定向。我如何解决它?
一般调试:如果你有机会获得apache配置本身,你可以启用一个RewriteLog
,这取决于你设置的级别,可以给你一步一步的匹配,当前值和修改的细目。整个url的匹配区别host
上下文(仅在apache的配置文件中可用)或per-di .htaccess
上下文背景:
什么是匹配?
在VirtualHost上下文中,该模式将首先与主机名和端口之后以及查询字符串(例如“/app1/index.html”)之前的URL的部分进行匹配。
在指南和htaccess的上下文,图案将最初被匹配针对文件系统路径,移除导致所述服务器向所述当前重写规则前缀后(例如,“APP1/index.html中”或“的index.html”取决于指令的定义位置)。
是,在一个VirtualHost
环境下,你有一个领先的/
,在.htcaccess
上下文(至极的净最例子假设,因为它更容易获得),这两者之间的区别,你没有这样的领先/
。
总之,在这里工作的,但不会在.htaccess
工作:
^/(myapp/login)
如果你想让它在两种情况下匹配,使领导/
可选:
^/?(myapp/login)
我认为否定词典相等运算符可能会有一些问题。我在mod_rewrite文档或其他地方找不到任何禁止使用的东西,但我也没有看到使用!=
的示例。事实上,文件表明,它应该工作,但你可以尝试只匹配“关”,而不是“不”,就像这样:
RewriteCond %{HTTPS} off
如果是这样的话,那将是非常难以解决使用通常的方法(例如,使用RewriteLog
)。
对于我来说,下面的代码工作(我认为这与的组合做=(如@jason表示)和端口
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(myapp/login) https://%{HTTP_HOST}/$1 [R=301,L,NC]
通过启用RewriteLog进行故障排除。但是,我只是添加一个前导'/'到'^ /(myapp/login)' – Wrikken 2013-03-05 23:46:56
就是这样!如果你回答它,我会给你赏金 – xain 2013-03-09 16:36:49
好的,详细阐述了一个,但是关于如何和为什么。 – Wrikken 2013-03-09 16:57:19