Nginx没有www到www和www到没有www

我正在使用nginx在Rackspace云之后的教程和搜索网,到目前为止不能得到这个排序。

我希望www.mysite.com正常访问mysite.com在.htaccess搜索引擎优化和其他原因。

我的/etc/nginx/sites-available/www.example.com.vhost配置:

server { listen 80; server_name www.example.com example.com; root /var/www/www.example.com/web; if ($http_host != "www.example.com") { rewrite ^ http://example.com$request_uri permanent; } 

我也试过了

 server { listen 80; server_name example.com; root /var/www/www.example.com/web; if ($http_host != "www.example.com") { rewrite ^ http://example.com$request_uri permanent; } 

我也试过了。 第二次尝试都会导致重定向循环错误。

 if ($host = 'www.example.com' ) { rewrite ^ http://example.com$uri permanent; } 

我的DNS设置为标准:

 site.com 192.192.6.8 A type at 300 seconds www.site.com 192.192.6.8 A type at 300 seconds 

(例如IP地址和文件夹已被用于示例,并在未来帮助人们)。 我使用Ubuntu 11。

HTTP解决方案

从文档中 ,“正确的方法是为example.org定义一个单独的服务器”:

 server { listen 80; server_name example.com; return 301 http://www.example.com$request_uri; } server { listen 80; server_name www.example.com; ... } 

HTTPS解决方案

对于那些想要解决方案,包括https://

 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 # example location / { rewrite ^/cp/login?$ /cp/login.php last; # etc etc... } } 

注意:由于我们使用的是loadbalancers,而https://服务器是高流量SSL支付服务器,所以我原来并没有在https://中包含https://我们不会混合使用https://和http://。


要检查nginx版本,请使用nginx -v

使用nginx重定向从url中删除www

 server { server_name www.domain.com; rewrite ^(.*) http://domain.com$1 permanent; } server { server_name domain.com; #The rest of your configuration goes here# } 

所以你需要有两个服务器代码。

使用nginx重定向将www添加到URL

如果你需要的是相反的,从domain.com重定向到www.domain.com,你可以使用这个:

 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# } 

正如你可以想象的那样,这与第一个例子相反。 这样,你不会得到搜索引擎优化,因为它是完整的烫发重定向和移动。 没有WWW被迫和显示的目录!

我的一些代码如下所示,以获得更好的观点:

 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; } } 

其实你甚至不需要重写。

 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必须处理并开始搜索。 如果使用return (应该在任何nginx版本中都可用),它将直接停止执行。 这在任何情况下都是首选。

将非SSL和SSL重定向到它们的非www对应项:

 server { listen 80; listen 443 ssl; server_name www.example.com; ssl_certificate path/to/cert; ssl_certificate_key path/to/key; return 301 $scheme://example.com$request_uri; } server { listen 80; listen 443 ssl; server_name example.com; ssl_certificate path/to/cert; ssl_certificate_key path/to/key; # rest goes here... } 

$scheme变量只包含http如果你的服务器只监听端口80(默认),listen选项不包含ssl关键字。 不使用变量不会获得任何性能。

请注意,如果您使用HSTS,则需要更多的服务器块,因为HSTS标头不应通过非加密连接发送。 因此,您需要带有重定向的未加密服务器块和带有重定向和HSTS头的加密服务器块。

将所有内容重定向到SSL(使用IPv4,IPv6,SPDY,…的UNIX上的个人配置):

 # # Redirect all www to non-www # server { server_name www.example.com; ssl_certificate ssl/example.com/crt; ssl_certificate_key ssl/example.com/key; listen *:80; listen *:443 ssl spdy; listen [::]:80 ipv6only=on; listen [::]:443 ssl spdy ipv6only=on; return 301 https://example.com$request_uri; } # # Redirect all non-encrypted to encrypted # server { server_name example.com; listen *:80; listen [::]:80; return 301 https://example.com$request_uri; } # # There we go! # server { server_name example.com; ssl_certificate ssl/example.com/crt; ssl_certificate_key ssl/example.com/key; listen *:443 ssl spdy; listen [::]:443 ssl spdy; # rest goes here... } 

我想你现在可以自己想像其他具有这种模式的化合物。

更多我的配置? 去这里和这里 。

你可能会发现你想使用相同的配置更多的域名。

以下代码段在任何域之前删除www:

 if ($host ~* ^www\.(.*)$) { rewrite / $scheme://$1 permanent; } 

以下是如何做到这一点从多个www到no-www服务器名称(我用这个子域名):

 server { server_name "~^www\.(sub1.example.com)$" "~^www\.(sub2.example.com)$" "~^www\.(sub3.example.com)$"; return 301 $scheme://$1$request_uri ; } 

这个解决方案来自我个人的经验。 我们使用了多个Amazon S3存储桶和一个服务器,将non-wwwwww域名以匹配S3“主机”标题策略 。

我为nginx服务器使用了以下配置:

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

这匹配所有指向服务器的域名,而不是以www.开头www. 并重定向到www.<domain> 。 以同样的方式,你可以做相反的重定向从wwwnon-www

你需要两个服务器块。

把这些放到你的配置文件中,比如/etc/nginx/sites-available/sitename

假设您决定使用http://example.com作为主要地址。;

你的配置文件应该是这样的:

 server { listen 80; listen [::]:80; server_name www.example.com; return 301 $scheme://example.com$request_uri; } server { listen 80; listen [::]:80; server_name example.com; # this is the main server block # insert ALL other config or settings in this server block } 

第一个服务器块将保存指令,用“www”前缀重定向任何请求。 它监听带有“www”前缀的URL的请求并重定向。

它没有别的。

第二个服务器块将保存您的主要地址 – 您要使用的URL。 所有其他设置都在这里像rootindexlocation等。检查默认文件中可以包含在服务器块中的其他设置。

服务器需要两个DNS A记录。

 Name: @ IPAddress: your-ip-address (for the example.com URL) Name: www IPAddress: your-ip-address (for the www.example.com URL) 

对于ipv6,使用您的-ipv6-address创建一对AAAA记录。

尝试这个

  if ($host !~* ^www\.){ rewrite ^(.*)$ https://www.yoursite.com$1; } 

其他方法:Nginx没有www到www

 server { listen 80; server_name yoursite.com; root /path/; index index.php; return 301 https://www.yoursite.com$request_uri; } 

和www到no-www

 server { listen 80; server_name www.yoursite.com; root /path/; index index.php; return 301 https://yoursite.com$request_uri; } 

独特的格式:

 server { listen 80; server_name "~^www\.(.*)$" ; return 301 https://$1$request_uri ; } 
 location / { if ($http_host !~ "^www.domain.com"){ rewrite ^(.*)$ $scheme://www.domain.com/$1 redirect; } } 

不知道是否有人注意到可能是正确的返回一个301,但浏览器呛它做

 rewrite ^(.*)$ https://yoursite.com$1; 

快于:

 return 301 $scheme://yoursite.com$request_uri; 

鬼博客

为了使nginx推荐的方法return 301 $scheme://example.com$request_uri; 与Ghost一起工作,您将需要添加到您的主服务器块中:

 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass_header X-CSRF-TOKEN; proxy_buffering off; proxy_redirect off; 

重定向非www到www

对于单个域:

 server { server_name example.com; return 301 $scheme://www.example.com$request_uri; } 

对于所有域名:

 server { server_name "~^(?!www\.).*" ; return 301 $scheme://www.$host$request_uri; } 

将www重定向到非www对于单个域:

 server { server_name www.example.com; return 301 $scheme://example.com$request_uri; } 

对于所有域名:

 server { server_name "~^www\.(.*)$" ; return 301 $scheme://$1$request_uri ; } 
 if ($host ~* ^www.example.com$) { return 301 $scheme://example.com$request_uri; } 

如果您无法正常工作,则可能需要添加服务器的IP地址。 例如:

 server { listen XXX.XXX.XXX.XXX:80; listen XXX.XXX.XXX.XXX:443 ssl; ssl_certificate /var/www/example.com/web/ssl/example.com.crt; ssl_certificate_key /var/www/example.com/web/ssl/example.com.key; server_name www.example.com; return 301 $scheme://example.com$request_uri; } 

其中XXX.XXX.XXX.XXX是IP地址(显然)。

注意:必须定义ssl crt和密钥位置才能正确重定向https请求

进行更改后不要忘记重新启动nginx:

 service nginx restart