?
从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...}