【问题标题】:generic non-www to www, and non-http to https通用非 www 到 www,非 http 到 https
【发布时间】:2012-02-14 07:44:45
【问题描述】:

我的 .htaccess 文件有以下代码,我从这里获取并尝试按照我从 .htaccess 的理解对其进行调整,但我似乎无法让它工作(或者浏览器可能已缓存它,但我似乎无法清除它)。

Options -Indexes
Options +FollowSymlinks

<IfModule mod_rewrite.c>

########## FORCE SSL ##########
RewriteEngine On
RewriteBase / 

# Non-secure requests to www.domain.com should redirect to https://www.domain.com
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.%{HTTP_HOST} [NC]
RewriteRule ^(.*)$ https://www\.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

# All secure (HTTPS) traffic should redirect to https://www.domain.com
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.%{HTTP_HOST} [NC]
RewriteRule ^(.*)$ https://www\.%{HTTP_HOST}/$1 [L,R=301] 

</IfModule>

我想让它尽可能通用,这样我就可以简单地将它复制并粘贴到我制作的任何网站上,因此无需每次都对其进行编辑 - 我想我也可以在 PHP 中执行此操作,但我认为这会很好如果 .htaccess 也在那里。

另一点是,如果我要访问 www.domain.com/.htaccess,是否可以读取 .htaccess,或者我是否需要以“全部拒绝”之类的方式来覆盖它?

【问题讨论】:

    标签: apache .htaccess mod-rewrite https


    【解决方案1】:

    RewriteCond 的第二个参数必须是正则表达式,因此它不能包含变量。

    尝试将以下内容添加到您的 .htaccess 文件中以代替您拥有的规则

    #capture top level domain (.com or .co.uk)
    RewriteCond %{HTTP_HOST} ([-_a-zA-Z0-9]+\.([a-zA-Z]{2,5}|co\.uk))$ [NC]
    RewriteCond %{HTTP_HOST} (www\.)?(.+)$ [NC]
    RewriteRule ^ - [E=MY_TLD:%2]
    
    # Non-secure requests to www.domain.com should redirect to https://www.domain.com
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://www\.%{ENV:MY_TLD}%{REQUEST_URI} [L,R=301] 
    
    # All secure (HTTPS) traffic should redirect to https://www.domain.com
    RewriteCond %{HTTPS} on
    #if host does not start with www
    RewriteCond %{HTTP_HOST} !^www\.[-_a-zA-Z0-9]+\.([a-zA-Z]{2,5}|co\.uk)$ [NC]
    RewriteRule ^ https://www\.%{ENV:MY_TLD}%{REQUEST_URI} [L,R=301] 
    

    【讨论】:

    • 这是否适用于 .com 和 .co.uk 域(因为我看到提到 TLD)?
    • 另外 - 只是在 RewriteBase 之后替换每一个,或者也去掉它?
    • @MrJ 已编辑以匹配 anydomain.com 或 anydomain.co.uk TLD。如有必要,可以添加其他人。是的,在RewriteEngine on RewriteBase /之后添加这个
    • 但不限于 .com 或 .co.uk ...我想我的意思是顶级域和二级域(如果你看到的话) - 虽然我想肯定有一些正则表达式可以找到域名后缀
    • 似乎可以在 Safari 中运行,Firefox 似乎已缓存但不会清除,但不错 :)
    【解决方案2】:

    最短的版本是:

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

    唯一的(有点)缺点是subdomain.example.com 被重定向到www.subdomain.example.com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2013-04-22
      • 1970-01-01
      • 2017-12-28
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多