【问题标题】:Force www and redirect root directory强制 www 并重定向根目录
【发布时间】:2019-10-10 21:27:17
【问题描述】:

我找不到可以回答我的问题,或者我无法使用正确的术语进行搜索,但请继续。我的 htaccess 中有以下规则:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com\.br$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.com\.br$
RewriteRule ^(.*)$ "https\:\/\/www\.domain\.com\.br\/site" [R=301,L]

这在用户仅输入 URL(domain.com.brwww.domain.com.br)时有效,但当用户以这种方式访问​​时我需要它重定向:

domain.com.br 或 www.domain.com.br --> https://www.domain.com.br/site
domain.com.br/XXX --> https://www.domain.com.br/XXX

我应该为此使用什么规则?

更新:服务器已经有强制SSL的默认规则,这种情况下不需要放在htaccess中

规则更新:

**On virtual host:**
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

**On htaccess file:**
RewriteCond %{HTTP_HOST} ^domain\.com\.br$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain\.com\.br$
RewriteRule ^/?$ https://www.domain.com.br/site/ [R=301,L]

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    您的代码会生成一个重定向循环。此外,您不需要转义目标上的斜线。

    您可以合并虚拟主机块中的所有内容(比使用 htaccess 更快):

    RewriteEngine On
    
    # force https
    RewriteCond %{HTTPS} off [NC]
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # force www
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    # redirect root directory to /site/
    RewriteRule ^/?$ /site/ [R=301,L]
    

    当然,您会看到一个重定向链,例如http://domain.tld/ 因为它将首先重定向到 https://domain.tld/ 然后到 https://www.domain.tld/ 最后到 https://www.domain/tld/site/。这可以。但是,如果你真的想只用一个重定向来处理所有事情,你可以。但是,它会不那么通用。

    例如,你最终会得到这些规则:

    RewriteEngine On
    
    # force root directory to /site/ (https+www)
    RewriteRule ^/?$ https://www.domain.com.br/site/ [R=301,L]
    
    # force any other pages to https+www if not the case already
    RewriteCond %{HTTPS} off [NC,OR]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^ https://www.domain.com.br%{REQUEST_URI} [R=301,L]
    

    【讨论】:

    • 嗨@Justin Iurman,感谢您的回答。但它没有按我的需要工作。我忘了评论,服务器已经有一个强制 SSL 的默认规则,在这种情况下,没有必要把它放在 htaccess 中。我需要除了强制www之外,他还有一个规则,当你在浏览器中只输入域(domain.com.br)时,如果你只输入域,没有页面名称,它应该总是重定向到@ 987654329@。有可能吗?
    • 我不确定我是否理解。您的意思是当您转到https://domain.com.br 时,它会重定向到www/site,即https://www.domain.com.br/site
    • 嗨,我用我需要的三个规则更新了问题,看看。如果用户不输入具体页面名称(domain.com.br or www.domain.com.br)直接访问域,则应该重定向到www.domain.com.br/site,如果输入带有具体页面的url,例如www.domain.com.br/contact,这种情况下规则只需要添加www.
    • 查看我编辑的答案。所以现在,(1)www 不在域中,则添加它,(2)https://www.domain.com.br/ 重定向到/site,而其他页面保持原样。对吗?
    • 是的,但是他正在创建一个重定向循环 查看所有访问方式:1:https://nimb.ws/Uy1Onu 2:https://nimb.ws/TwHohl 3:https://nimb.ws/w5rpqL 4:https://nimb.ws/5Qed92(这里没有放 www) 5:https://nimb.ws/mnWwIT 这样会因为循环而减慢访问速度。
    猜你喜欢
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2016-07-05
    • 2018-08-20
    相关资源
    最近更新 更多