我正在尝试配置我的Nginx以从主机名中删除www.
。
我正在寻找处理可能的子域案例的通用规则。
E.g。如果http://www.foo1.sample.com
和http://www.fooX2.sample.com
是两个域。
然后我想在这些子域之前删除任何www.
,并将它们分别重定向到http://foo1.sample.com
和http://fooX2.sample.com
(不知道规则中的确切子域。)
感谢。
答案 0 :(得分:12)
我认为在Nginx conf file
中添加以下if块应该适合您。它还会处理你提到的子域名。
if ($host ~* ^www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*) http://$host_without_www$1 permanent;
}
答案 1 :(得分:2)
最佳实践和最有效的方法是为此使用单独的server
定义。
这不仅可以确保将配置自动应用于nginx实例上托管的每个网站,而且还可以确保您最终不会在主机名上运行正则表达式您的代码中有多个实例。
以下是最简单的形式:
server {
listen 80;
server_name ~^www\.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}
如果您确实使用 https
,则事情会变得更加复杂,因为您必须确保证书不匹配。除非您为所有域都拥有一个证书,否则最好仅对所有内容进行硬编码,因为无论如何它都已经在证书中进行了硬编码,并且由于证书要求,上述解决方案根本不可能实现。 >
请注意,使用rewrite ^(.*) http://…$1 …
的问题的其他答案是错误的,将导致您丢失$query_string
,并可能会破坏根据{{3 }}。
如果您需要基于if
的方法并且不建议进行硬编码(例如,与其他答案一样都不推荐),则至少应使用正确的范例,以免{ {1}};请注意,根据Nginx pass_proxy subdirectory without url decoding,nginx server name regex when "Host" header has a trailing dot变量已经被nginx规范化了(删除了跟踪点,整个东西都变成了小写),因此,您不必担心不区分大小写比较,就像在另一个答案中一样:
$query_string