如何让nginx从wwwredirect到非www域?

比方说,我想从www.example.comredirect到example.com,我想用nginx来做到这一点。 我环顾四周,没有看到任何好的文档,所以我想我会问,回答我自己的问题。

我也在Nginx wiki和其他博客上看到了这一点,性能明智的最佳方法是执行以下操作:

使用nginx(编写时版本1.0.12)将www.example.comredirect到example.com。

server { server_name www.example.com; rewrite ^ $scheme://example.com$request_uri permanent; # permanent sends a 301 redirect whereas redirect sends a 302 temporary redirect # $scheme uses http or https accordingly } server { server_name example.com; # the rest of your config goes here } 

当请求来到example.com时,没有if语句用于执行。 它使用$ request_uri而不是创build1美元的匹配,重写税收(参见Nginx常见陷阱页面)。

资料来源:

经过一些挖掘和一些失误,这里是解决scheme。 我遇到的问题是确保使用“ http://example.com $ uri”。 在$ uri前面插入一个/会导致redirect到http://example.com//

  server { listen 80; server_name www.example.com; rewrite ^ http://example.com$uri permanent; } # the server directive is nginx's virtual host directive. server { # port to listen on. Can also be set to an IP:PORT listen 80; # Set the charset charset utf-8; # Set the max size for file uploads to 10Mb client_max_body_size 10M; # sets the domain[s] that this vhost server requests for server_name example.com; # doc root root /var/www/example.com; # vhost specific access log access_log /var/log/nginx_access.log main; # set vary to off to avoid duplicate headers gzip off; gzip_vary off; # Set image format types to expire in a very long time location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ { access_log off; expires max; } # Set css and js to expire in a very long time location ~* ^.+\.(css|js)$ { access_log off; expires max; } # Catchall for everything else location / { root /var/www/example.com; access_log off; index index.html; expires 1d; if (-f $request_filename) { break; } } } 

请访问这个问题在SO: https : //stackoverflow.com/a/11733363/846634

从更好的答案:

其实你甚至不需要重写。

 server { #listen 80 is default server_name www.example.com; return 301 $scheme://example.com$request_uri; } server { #listen 80 is default server_name example.com; ## here goes the rest of your conf... } 

因为我的回答是越来越多的投票,但上面也是如此。 你不应该在这种情况下使用rewrite 。 为什么? 因为nginx必须处理并开始search。 如果使用return (应该在任何nginx版本中都可用),它将直接停止执行。 这在任何情况下都是首选。

要redirect到非www,请修改vhost文件:

 server { listen 80; server_name www.example.com; rewrite ^/(.*) http://example.com/$1 permanent; } 

“永久”将redirect转换为301redirect。 在这个代码块后,你可以configuration没有www的域。

为了将非wwwredirect到www:

 server { listen 80; server_name example.com; rewrite ^/(.*) http://www.example.com/$1 permanent; } 

Thassit。

顺便说一句,使用Nginx的完整VPS设置,请查看我的网站上的VPS圣经,guvnr.com,我希望这很方便!

这是我使用的:

 # --------------------------------------- # vHost www.example.com # --------------------------------------- server { ## # Redirect www.domain.tld ## server_name www.example.com; rewrite ^(.*) http://example.com$1 permanent; } # --------------------------------------- # vHost example.com # --------------------------------------- server { # Something Something }