htaccess - 删除www并有选择地强制https

时间:2013-01-17 17:02:59

标签: apache .htaccess mod-rewrite

难以找到组合以满足以下3个条件。什么重写规则和条件将完成条件? (我已经对不起作用的规则感到惊讶。)

  1. www从所有请求中删除
  2. https用于所有主要
  3. 的请求
  4. http对 子域名 的所有请求(在主站点的子文件夹中)subdomain.com
  5. htaccess的:

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP_HOST} ^www\.primary\.mobi [NC,OR]
    RewriteCond %{HTTP_HOST} ^primary\.mobi [NC,OR]
    RewriteCond %{HTTP_HOST} !^(www\.)?subdomain\.com [NC]
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    以上内容不会剥离www并将www.subdomain发送到https。

    欢迎解释。试图理解apache mod_rewrite手册页并尝试了几种方法但没有成功。

1 个答案:

答案 0 :(得分:0)

您可以捕获域并在RewriteRule中使用它。 HTTP_REQUEST在替换部分中不可用,但仅在RewriteCond指令中可用。

我不确定,但您可以尝试将其拆分为两个.htaccess文件。这个进入主目录

RewriteEngine On

# remove www. from HTTPS requests
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(primary\.mobi)$ [NC]
RewriteRule .* https://%1/$0 [R,L]

# redirect HTTP requests to HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)?(primary\.mobi)$ [NC]
RewriteRule .* https://%1/$0 [R,L]

这适用于子域文件夹中的.htaccess

RewriteEngine On

# remove www. from HTTP requests
RewriteCond %{HTTP_HOST} ^www\.(subdomain\.com)$ [NC]
RewriteRule .* http://%1/$0 [R,L]

# redirect HTTPS requests to HTTP
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^(?:www\.)?(subdomain\.com)$ [NC]
RewriteRule .* http://%1/$0 [R,L]

在没有 301的情况下测试您的规则,因为浏览器会缓存301结果并使测试更加困难。在您对规则感到满意之前,请先添加R=301

Canonical Hostnames中描述了一些替代方案,尤其是第一个使用虚拟主机的方案,看起来很有希望

<VirtualHost *:80>
    ServerName www.primary.mobi
    Redirect / https://primary.mobi/
</VirtualHost>

<VirtualHost *:80>
    ServerName primary.mobi
</VirtualHost>

<VirtualHost *:80>
    ServerName www.subdomain.com
    Redirect / http://subdomain.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName subdomain.com
</VirtualHost>

我不知道,如果这对你来说是可行的,你可以试试。