Apache 预编';www';使用.htaccess&;修改

Apache 预编';www';使用.htaccess&;修改,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我对这件事感到进退两难。通过下面的代码,我能够在任何非SSL url上强制使用SSL,但是当用户(以及来自Google的结果)将用户带到时,我们遇到了一个问题,因为url随后被重写为 由于我的证书绑定到www.mysite.co.za,它会立即抛出一个安全错误,因为url中缺少“www” 当域以HTTPS而不是HTTP开始时,有人能指出一种将www添加到域中的方法吗 非常感谢 当前添加https://的代码如下: RewriteCond %{HTTP_HOST} !^www\. RewriteC

我对这件事感到进退两难。通过下面的代码,我能够在任何非SSL url上强制使用SSL,但是当用户(以及来自Google的结果)将用户带到时,我们遇到了一个问题,因为url随后被重写为

由于我的证书绑定到www.mysite.co.za,它会立即抛出一个安全错误,因为url中缺少“www”

当域以HTTPS而不是HTTP开始时,有人能指出一种将www添加到域中的方法吗

非常感谢

当前添加https://的代码如下:

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
当域以HTTPS而不是HTTP开始时,有人能指出一种将www添加到域中的方法吗

所以你想要这个:

  • 如果主机不是以www开头:
    • 如果连接安全,请不要执行任何操作。在这种情况下,您已经被搞砸了,因为用户已经看到主机不匹配警告
    • 如果连接不安全,则重定向到{HTTP_HOST}%{REQUEST_URI}
您当前的规则:

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
此规则对您无效,因为无论连接是否安全,它都会添加www。此外,它保持了纯http的原样(不转发到https://)

满足上述要求的规则是

#if the host does not start with www.
RewriteCond %{HTTP_HOST} !^www\.
#and the connection is not secure
RewriteCond %{HTTPS} =""
#forward
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]
L
标志是不必要的,因为重定向结束重写

当域以HTTPS而不是HTTP开始时,有人能指出一种将www添加到域中的方法吗

所以你想要这个:

  • 如果主机不是以www开头:
    • 如果连接安全,请不要执行任何操作。在这种情况下,您已经被搞砸了,因为用户已经看到主机不匹配警告
    • 如果连接不安全,则重定向到{HTTP_HOST}%{REQUEST_URI}
您当前的规则:

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
此规则对您无效,因为无论连接是否安全,它都会添加www。此外,它保持了纯http的原样(不转发到https://)

满足上述要求的规则是

#if the host does not start with www.
RewriteCond %{HTTP_HOST} !^www\.
#and the connection is not secure
RewriteCond %{HTTPS} =""
#forward
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]

L
标志是不必要的,因为重定向会结束重写。

这并不能回答您的问题,但这肯定是解决问题的一种方法:


默认情况下,来自Digicert的SSL证书将保护同一域的WWW和非WWW变体。我不知道还有哪个主流证书颁发机构会这样做-

这并不能回答您的问题,但这肯定是解决问题的一种方法:


默认情况下,来自Digicert的SSL证书将保护同一域的WWW和非WWW变体。我不知道还有哪家主流证书颁发机构会这样做-

即使重定向,您也会收到至少一条警告。这是因为浏览器在服务器到达重定向点之前检查SSL证书重定向到www,然后重定向到HTTPS。@Kerry:或重定向到
https://www.mysite.co.za/
任何地方都可以直接访问。此规则不会强制HTTPS。它只会强制主机名以
www.开头。
@Gareth:谢谢你澄清这个问题,Gareth,我想知道是否会是这样。如果浏览器在服务器执行它的操作之前检查SSL与域名的匹配,那么在https情况下,可能无法将www作为url的前缀!即使有重定向,您也总是会收到至少一个警告。这是因为浏览器在服务器到达重定向点之前检查SSL证书重定向到www,然后重定向到HTTPS。@Kerry:或重定向到
https://www.mysite.co.za/
任何地方都可以直接访问。此规则不会强制HTTPS。它只会强制主机名以
www.开头。
@Gareth:谢谢你澄清这个问题,Gareth,我想知道是否会是这样。如果浏览器在服务器执行它的操作之前检查SSL与域名的匹配,那么在https情况下,可能无法将www作为url的前缀!感谢Artefactor,这段代码为我清除了一些烟雾,但是要明确的是,我在非SSL目录上有另一个.htaccess文件,它重定向到https没有问题,即使www被遗漏,它也会预先设置它并将用户发送到安全站点。问题仍然在于安全目录。你是在告诉我,如果用户登录,再多的重写规则都不能将www前缀添加到url,因为浏览器在应用规则之前已经检查了证书?我需要知道是否唯一的解决方案是拥有两个SSL证书?如果用户转到,证书将在用户发送其请求的主机名之前显示,因此apache无法决定要发送的证书。您不仅需要另一个证书,还需要另一个IP地址。但是,您可以获得对mysite.co.za和www.mysite.co.za都有效的证书。大多数当前的web浏览器都支持这些证书。当然,您可以有两个证书,一个用于mysite.co.za,另一个用于www.mysite.co.za,因为理论上这是两个不同的域名。您不需要有一个支持两个域的通用证书。@webfac如果两个域解析为同一IP地址,您需要有一个支持这两个域的证书。多亏了Artefact,这段代码为我清除了一些烟雾,但是,要明确的是,我在非SSL目录中有另一个.htaccess文件,它可以毫无问题地重定向到https,即使不使用www,它也会将其前置并将用户发送到安全站点。问题仍然在于安全目录。你是在告诉我,如果用户登录,再多的重写规则都不能将www前缀添加到url,因为浏览器在应用规则之前已经检查了证书?我需要知道是否唯一的解决方案是拥有两个SSL证书?如果用户转到,证书将在u