删除www.使用Nginx Rewrite从主机名

Tza*_*man 9 rewrite nginx

我正在尝试配置我的Nginx以www.从主机名中删除.我正在寻找处理可能的子域案例的通用规则.

例如,如果http://www.foo1.sample.com并且http://www.fooX2.sample.com是两个域.

然后我想www.在这些子域之前删除任何子域,并将它们分别重定向到(http://foo1.sample.com并且http://fooX2.sample.com不知道规则中的确切子域.)

谢谢.

cns*_*nst 13

最佳实践:

最佳实践以及最有效的方法是为此使用单独的server定义。

这不仅可以确保配置自动应用于托管在 nginx 实例上的每个网站,而且还可以确保您最终不会在来自多个实例的主机名上运行正则表达式你的代码。

以下是最简单的形式:

server {
    listen      80;
    server_name ~^www\.(?<domain>.+)$;
    return  301 $scheme://$domain$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

如果您确实使用https,那么事情会变得更加复杂,因为您必须确保证书不会不匹配。除非您的所有域都有一个证书,否则最好对所有内容进行硬编码,因为它已经在证书中进行了硬编码,并且由于证书要求,上述解决方案根本不可能。


选择:

请注意,该问题的另一个答案rewrite ^(.*) http://…$1 …是不正确的,并且会导致您丢失$query_string,并且可能会根据Nginx pass_proxy 子目录破坏请求的编码,而无需 url 解码

如果您需要if基于 - 的方法并且没有硬编码,这两种方法都不推荐,例如,像另一个答案一样,那么至少使用正确的范例,以避免膨胀和丢失$query_string; 请注意,根据nginx 服务器名称正则表达式,当“主机”标头具有尾随点时,该$host变量已被 nginx 规范化(尾随点已删除,整个内容变为小写),因此,您无需担心执行不区分大小写的比较,如另一个答案,要么:

if ($host ~ ^www\.(?<domain>.+)$) {
    return  301 $scheme://$domain$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

参考:


lal*_*lit 12

我想添加以下If if in your Nginx conf file应该适合你.它还会照顾你提到的子域名.

if ($host ~* ^www\.(.*)) {       
    set $host_without_www $1;
    rewrite ^(.*) http://$host_without_www$1 permanent;
}
Run Code Online (Sandbox Code Playgroud)