提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

最近正好用到,在网上找了些资料,然后记录这里,算是备忘吧。对于Apache的.htaccess和ASP/PHP脚本定向的方法可以参考 《主机域名www的自适应301重定向方法》

比如说我们有域名example.com,然后配置我们的Nginx服务器,希望绑定两个域名不带www的example.com以及www.example.com。绑定域名可以在你的Nginx配置文件的server {}节做下述配置。

server {
    listen 80;
    server_name example.com www.example.com;
  }

这样配置后example.com和www.example.com都指向我们的服务器了,虽然这样没有什么,但是这对于搜索引擎是不友好的,不利于网站的SEO,所以我们需要利用301重定向一个域名到另一个域名上。

在Nginx的server节中引入$host变量,这个指代当前访客访问主机时使用的主机名(域名)。接下来我们可以利用if条件语句配合rewrite permanent方式做301定向了。

# 示例1: 将example.com定向到www.example.com
  server {
    listen 80;
    server_name example.com www.example.com;
    if ($host != 'www.example.com') {
      rewrite ^/(.*)$ http://www.example.com/$1 permanent;
    }
  }

  # 示例2: 将www.example.com定向到example.com
  server {
    listen 80;
    server_name example.com www.example.com;
    if ($host != 'example.com') {
      rewrite ^/(.*)$ http://example.com/$1 permanent;
    }
  }

上面举了两个例子分别判断当前的请求主机域是否符合我们的要求,不符合则截取请求路径/后面的内容并附加到我们期望的url后面,同时作301永久定向(permanent)。当然这里我们使用的是不等于!=来进行判断的,如果使用等于的话就直接使用等于号(=)进行判断并将条件更改为我们不期望的主机域就可以了。

这里有几个问题需要注意一下:

1. 上述配置文件的if语句与括号必须以一个空格隔开,否则Nginx会报nginx: [emerg] unknown directive "if($host" in...错误。

2. Nginx的条件判断不等于是!=,等于是=,注意这里的等于只有一个等于号,如果写成==,则Nginx会报nginx: [emerg] unexpected "==" in condition in...错误。

3. 301永久转向配置成功后,浏览器可能会有记忆效应,比如说IE。所以一旦配置并利用浏览器访问过页面,那么你更改了301转向配置后,这个页面可能依旧是上次的转向,建议清除浏览器缓存,或者尝试访问其他页面,也可以在url的?问号后面加上一些随机的参数,避免浏览器的缓存记忆效应。

配置完成后,可以使用 nginx -s reload 命令进行平滑的更新配置(不重启Nginx)。