Apache mod_rewrite 更改域名扩展

Apache mod_rewrite 更改域名扩展

我想要一个 4 个条件的 mod_rewrite。

http to https
http://example.com to https://example.com

www. to non-www.
https://www.example.com to https://example.com

non-plural ending to plural ending domain
https://www.example.com to https://examples.com

.com (or that is not .co) domain extension to .co
https://www.example.com to https://examples.co

我到目前为止有这样的代码:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.co%{REQUEST_URI} [L,NE,R=301]

我很难找到一个可以带来改变的例子例子例子.com(或其他非 .co).co

我可以添加上面的代码吗?还是还需要创建另一个 RewriteRule?

请注意,我想保留所有子域名(www. 除外),如果有人写了 www.subdomain.example.com,我想保留子域名但删除前导 www. 并将 example.com 更改为 examples.co。

答案1

您在末尾附加的有关子域名的“注释”实际上是这里的主要复杂之处。

因此,规范域名是examples.co。除规范域名之外的任何请求都需要重定向到规范域名。

请尝试以下操作:

RewriteEngine On

# Redirect HTTP to HTTPS and remove any www subdomain and trailing dot (FQDN)
# NB: Potentially includes a subdomain
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=302]

# Canonicalise the hostname "examples.co" and retain an optional subdomain
# NB: The www (sub)subdomain has already been removed.
#     Potentially includes a subdomain.
RewriteCond %{HTTP_HOST} !examples\.co$
RewriteCond %{HTTP_HOST} ^([^.]+\.)?examples?\. [NC]
RewriteRule ^ https://%1examples.co%{REQUEST_URI} [L,NE,R=302]

第一条规则主要删除可选的 www 子域(或子子域)。%1反向引用包含主机名减去 www 子域(如果有)和任何尾随点(FQDN) - 如条件模式 ^(?:www\.)?(.+?)\.?$

第二条规则规范化域名。任何可选的子域名都会被捕获(在%1反向引用中),而其后的所有内容都会被忽略。我们已经知道请求的主机名不是以结尾的examples.co(第一个状况)。

这将导致最多 2 次重定向。当请求非规范域名时,会发生第二次重定向。

例如:

  • 请求http://www.examples.co/foo=> https://examples.co/foo
  • 请求http://www.example.com/foo=> https://example.com/foo=> https://examples.co/foo
  • 请求http://www.subdomain.example.com/=> https://subdomain.example.com/=> https://subdomain.examples.co/

使用 302(临时)重定向进行测试以避免缓存问题。只有确认其正常运行后才更改为 301。测试前您需要清除浏览器缓存。

这确实假设你没有实施高速传输系统。如果是,那么您将需要首先在同一主机上将 HTTP 重定向到 HTTPS。

请注意,如果您使用标准通配符子域名(如您的其他问题),那么请求https://www.<subdomain>.<domain>很可能会被浏览器阻止(因此不会发生重定向),因为 SSL 证书无效。

相关内容