从nginx的官方文档 documentation, 正确的nginx https 301跳转到带www域名方法的方法如下:
HTTP 301跳转到带www域名方法
复制代码 代码如下: server { listen 80; server_name XXX.org; return 301 http://www.XXX.org$request_uri; }
server { listen 80; server_name www.XXX.org; ... }
HTTPS 301跳转到带www域名方法
复制代码 代码如下: server { listen 80; server_name www.domain.com; // $scheme will get the http protocol // and 301 is best practice for tablet, phone, desktop and seo return 301 $scheme://domain.com$request_uri; } server { listen 80; server_name domain.com; // here goes the rest of your config file // XXX location / { rewrite ^/cp/login?$ /cp/login.php last; // etc etc... } }
要先用 nginx -v 命令检查你所说使用的nginx的版本. 下面是对于旧版本的nginx301跳转到带www域名方法从www.ksharpdabu.info 跳转到 ksharpdabu.info
复制代码 代码如下:server { server_name www.domain.com; rewrite ^(.*) http://domain.com$1 permanent; }
server { server_name domain.com; #The rest of your configuration goes here# }
所以需要两个server段。
从ksharpdabu.info 跳转到 www.ksharpdabu.info
复制代码 代码如下:server { server_name domain.com; rewrite ^(.*) http://www.domain.com$1 permanent; }
server { server_name www.domain.com; #The rest of your configuration goes here# }
按上面设置后,用rewrite的方法跳转到指定的域名下,利于SEO下面是我举例,从www.google.com 跳转到 google.com的部分nginx配置内容:
复制代码 代码如下:server { server_name www.google.com; rewrite ^(.*) http://google.com$1 permanent; } server { listen 80; server_name google.com; index index.php index.html; #### # now pull the site from one directory # root /var/www/www.google.com/web; # done # location = /favicon.ico { log_not_found off; access_log off; } }
网上还有一种不用rewirte的 方法,如下:
复制代码 代码如下:server { #listen 80 is default server_name www.XXX.com; return 301 $scheme://XXX.com$request_uri; }
server { #listen 80 is default server_name XXX.com; ## here goes the rest of your conf... }
因为return可以用于所有的版本,而rewrite可能因为版本的不同,导致301出错。而且可以直接停止执行匹配和搜索。
下面包含了http和https的。同一个服务器。
复制代码 代码如下:server { listen 80; listen 443 ssl; server_name www.XXX.com; return 301 $scheme://XXX.com$request_uri; }
server { listen 80; listen 443 ssl; server_name XXX.com; # rest goes here... }
$scheme 变量只会包含http 如果你的服务器只监听80端口(默认是80端口)同时监听的选项中不含ssl关键字 . 不适用这个变量,就不能获得你所想的要的跳转结果。
将所有http强制跳到https, SSL (personal config on UNIX with IPv4, IPv6, SPDY, ...):
复制代码 代码如下:## Redirect all www to non-www#server { server_name www.XXX.com; ssl_certificate ssl/XXX.com/crt; ssl_certificate_key ssl/XXX.com/key; listen *:80; listen *:443 ssl spdy; listen [::]:80 ipv6only=on; listen [::]:443 ssl spdy ipv6only=on;return 301 https://XXX.com$request_uri;}
## Redirect all non-encrypted to encrypted#server { server_name XXX.com; listen *:80; listen [::]:80;
return 301 https://XXX.com$request_uri;}
## There we go!#server { server_name XXX.com; ssl_certificate ssl/XXX.com/crt; ssl_certificate_key ssl/XXX.com/key; listen *:443 ssl spdy; listen [::]:443 ssl spdy;
# rest goes here...} ## Redirect all www to non-www#server { server_name www.XXX.com; ssl_certificate ssl/XXX.com/crt; ssl_certificate_key ssl/XXX.com/key; listen *:80; listen *:443 ssl spdy; listen [::]:80 ipv6only=on; listen [::]:443 ssl spdy ipv6only=on; return 301 https://XXX.com$request_uri;} ## Redirect all non-encrypted to encrypted#server { server_name XXX.com; listen *:80; listen [::]:80; return 301 https://XXX.com$request_uri;} ## There we go!#server { server_name XXX.com; ssl_certificate ssl/XXX.com/crt; ssl_certificate_key ssl/XXX.com/key; listen *:443 ssl spdy; listen [::]:443 ssl spdy; # rest goes here...}