子域名https www到非www

时间:2016-09-15 13:29:12

标签: apache .htaccess redirect ssl

我有一个名为example.com的域名,在此域名中有两个子域名:

  • qa1.example.com
  • qa2.example.com

所有这些都有SSL认证。但是,我有一个.htaccess文件如下:

已更新

Options +FollowSymlinks

Options -Indexes

<FilesMatch "\.(tpl|ini|log|xml)">
 Order deny,allow
 Deny from all
</FilesMatch>

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?route=$1 [L,QSA]
RewriteCond %{HTTPS} !=on
RewriteRule %{HTTP_HOST} ^www\.
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteRule ^download/(.*) /index.php?route=error/not_found [L]

发生以下情况:

  1. http://qa1.example.com&gt;重定向到&gt; https://qa1.example.com
  2. http://www.qa1.example.com&gt;重定向到&gt; https://www.qa1.example.com
  3. https://www.qa1.example.com&gt;重定向到&gt; https://www.qa1.example.com
  4. 数字1是正确的,但是数字2和3需要在没有https://qa1.example.com的情况下重定向到www

    如何实现这一目标?我可以分别为这两个子域包含.htaccess文件。

1 个答案:

答案 0 :(得分:0)

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

您的规范HTTP到HTTPS和www到非www重定向应该内部重写(路由指令)之前。在RewriteBase指令之后。

尝试以下方法:

# www to non-www canonicalisation (including subdomains)
RewriteRule %{HTTP_HOST} ^www\.(.*)
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

# HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Internal rewrites / routing goes here...

如果您没有其他子域,将这些子域合并为一个规则则相对简单。此外,这应该是301(永久)重定向,而不是302(临时),这是R标志默认的内容。 (但是,使用临时重定向进行测试可能更容易,因为它们不会被浏览器缓存。)

更新:以上指令假设这些内容都在您的主域.htaccess文件中,并且子域都是由此控制的(在主域的文档根目录下的子目录中)。对于子域.htaccess文件,它们仍然可以正常工作,但是,它们可以优化为单个规则(最多一个重定向,而不是两个)。例如:

# www to non-www and HTTP to HTTPS canonicalisation
RewriteCond %{HTTPS} !=on [OR]
RewriteRule %{HTTP_HOST} ^www\.
RewriteRule ^ https://qa1.example.com%{REQUEST_URI} [R=301,L]

以上显然硬编码子域的主机名。如果您只有两个子域,那么这应该不是问题。它肯定是更安全

要概括上述内容,您可以使用SERVER_NAME变量。但是,您需要确保在服务器配置中首先设置UseCanoncialName On(默认为Off),否则这将只保留请求中的主机名(这是您看到的问题的一部分)在你的问题)。 ServerName指令也需要设置为正确的子域。例如。 ServerName qa1.example.com

# www to non-www and HTTP to HTTPS canonicalisation
# UseCanonicalName On - must be set in server config
RewriteCond %{HTTPS} !=on [OR]
RewriteRule %{HTTP_HOST} ^www\.
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]