2013-03-02 38 views
1

工作,我配置了以下重定向:不重定向在Apache中

<VirtualHost ...> 
    <Directory ...> 

    RewriteEngine On 
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^(myapp/login) https://%{HTTP_HOST}:443/$1 [NC,R=301,L] 

但它不重定向。我如何解决它?

+0

通过启用RewriteLog进行故障排除。但是,我只是添加一个前导'/'到'^ /(myapp/login)' – Wrikken 2013-03-05 23:46:56

+0

就是这样!如果你回答它,我会给你赏金 – xain 2013-03-09 16:36:49

+0

好的,详细阐述了一个,但是关于如何和为什么。 – Wrikken 2013-03-09 16:57:19

回答

2

一般调试:如果你有机会获得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) 
0

我认为否定词典相等运算符可能会有一些问题。我在mod_rewrite文档或其他地方找不到任何禁止使用的东西,但我也没有看到使用!=的示例。事实上,文件表明,它应该工作,但你可以尝试只匹配“关”,而不是“不”,就像这样:

RewriteCond %{HTTPS} off 

如果是这样的话,那将是非常难以解决使用通常的方法(例如,使用RewriteLog)。

1

对于我来说,下面的代码工作(我认为这与的组合做=(如@jason表示)和端口

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule ^(myapp/login) https://%{HTTP_HOST}/$1 [R=301,L,NC]