【问题标题】:.htaccess - Force use of single domain and SSL.htaccess - 强制使用单域和 SSL
【发布时间】:2017-06-18 11:11:01
【问题描述】:

我有一个用于 www.example.com 的 SSL,还有一堆别名域(例如 mydomain.co.uk、otherdomain.com 等)停放在 cPanel 帐户上。

我想做的是对所有请求强制使用https://www.example.com。域之后的任何内容都应按原样附加(稍后也会在 .htaccess 中为 SEO 友好的 URL 重写)。

例如:-

http://example.com/page/2/
https://example.com/page/2/
http://www.otherdomain.com/page/2/
http://mydomain.co.uk/page/2/

都应该变成

https://www.example.com/page/2/

这几乎可以工作:-

RewriteEngine on

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

但是可以一次性完成吗?此外,上面将查询字符串再次附加到 URL,例如:-

http://www.example.com/page/2/

最后是:-

https://www.example.com/page.php/2/?2/

搜索引擎友好的SEO部分是:-

Options +SymlinksIfOwnerMatch +MultiViews
RewriteRule ^(.*).php/(.*) $1.php?$2

应该保持不变。

IIRC,在我强制使用 SSL 之前,仅 www.example.com 的强制工作正常:-

RewriteEngine on

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http%2://www.example.com/$1 [R=301,L]

非常感谢任何帮助!

【问题讨论】:

  • 看起来很相似,但下面@starkeen 的回答给出了更好(如果不完美)的结果。建议的副本上的答案实际上对我不起作用,也许是由于我有 SEO 友好的添加?
  • 规则实际上是相同的,这是该标签最常见的问题类型。你只是在帮助用废话填满SO。在所有其他重写发生之前,您是否将新代码放在首位?
  • 是的,我把这个放在第一位。很抱歉用几个字节的文本填充 SO,如果您认为这是废话,很抱歉,但是尽管尝试了在 SO 找到的各种解决方案,但我没有解决我的问题,所以发布问题以防任何即将到来的答案可能会有所帮助我和其他人。这不就是我们在这里的原因吗???
  • SO 的目的是成为每个人解决问题的有用参考,而不仅仅是你的问题。可悲的是,它充满了“我找不到确切的解决方案而且我没有 RTFM”。问题。当您的问题不常见并且滚雪球时,这会更难找到相关的解决方案。 I doubt your problem has not been solved before.

标签: apache .htaccess ssl mod-rewrite


【解决方案1】:

要在单个重定向中强制使用 www 和 https,您可以使用以下规则:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,NE,R]

【讨论】:

  • 谢谢,我将第二个条件更改为 RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] 以强制 example.com 域以及 www。但是,我仍然会收到类似的结束网址:-example.com/page.php/2/?2 有这个吗?
【解决方案2】:

试试这个版本。它使用浏览器发送的原始请求,因此应该不受其他重写的影响。如果您仍然遇到额外的垃圾,它来自其他地方。

RewriteEngine on
RewriteCond %{HTTPS} =off [OR]
RewriteCond %{HTTP_HOST} !=www.example.com [NC]
#RewriteCond %{HTTP_HOST} !=your.dev.server [NC]
RewriteCond %{THE_REQUEST} ^\S++\s++(\S++)
RewriteRule ^ https://www.example.com%1 [DPI,NE,L,R=301]

额外的注释规则是为了以防您需要在您的开发服务器上避免这种重定向。

【讨论】:

  • 谢谢@Walf。我在我的开发服务器上设置了一个环境变量 (DEV_SERVER),并在 .htaccess 中使用 ... 来忽略那里不需要的任何内容。这个最新版本给出的结果与其他版本相同,因此您必须是正确的,因为它来自其他地方。我使用的 CMS 在某些情况下会使用 301 重定向 (PHP) 重写 URL,它必须是这样,但据我所知,(.htaccess) 重写的 URL 很好。正确的页面显示,并且 HTML 包含规范的 URL,所以我可以忍受这个。再次感谢您的坚持!
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2016-09-25
  • 2013-04-28
  • 2011-05-22
  • 2018-12-22
  • 2012-02-02
  • 2013-01-19
相关资源
最近更新 更多