泰山神 发表于 2018-11-15 09:55:12

nginx重定向设置

  不久前,公司业务平台上发现用户访问公司官方网站时,携带两个域名的cookie到后端(分别时domain.com,www.domain.com)。为了解决这个问题,首先分析公司对域名的使用是否涉及到domain.com,发现没有,那就有必要将访问domain.com的用户跳转到www.domain.com。于是先从DNS域名解析入手。我们使用的是DNspod,在原来的A记录(@    A    223.*.*.305)基础上修改为(@    显性URL    http://www.domain.com),这样就解决了上述问题。
  今天突然发现,上面的解决方案有问题,就是在访问domain.com的时候跳转到www.domain.com会有时生效,有时无法访问。经过与DNSpod官方技术人员联系,确定做URL跳转的服务器放置在国外,有国外跳转到国内这样就出现了成功率不高的问题。为了继续解决问题,将上述A记录改回原样,在服务器端nginx做修改,使用nginx的重定向功能实现。具体使用方法如下:
  http{
  include       mime.types;
  default_typeapplication/octet-stream;
  sendfile      on;
  #tcp_nopush   on;
  #keepalive_timeout0;
  keepalive_timeout65;
  upstream XX {
  server 10.124.X.X max_fails=3 fail_timeout=30s;
  server 10.124.X.X max_fails=3 fail_timeout=30s;
  }
  gzipon;
  gzip_comp_level 7;
  gzip_min_length 1024;
  gzip_buffers 4 8k;
  gzip_types text/plain application/javascript text/css ;
  output_buffers 1 32k;
  postpone_output 1460;
  limit_req_zone $binary_remote_addr zone=allips:10m rate=300r/m;
  #HTTP
  server {
  listen       80;
  server_name*.domain.com domain.com;
  client_max_body_size 1000m;
  large_client_header_buffers 4 16k;
  client_body_buffer_size 128k;
  proxy_connect_timeout 600;
  proxy_read_timeout 600;
  proxy_send_timeout 600;
  proxy_buffer_size 64k;
  proxy_buffers   4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  charset utf8;
  location /XX/ {
  limit_req zone=allips burst=10 ;
  proxy_pass http://XX/api/;
  proxy_redirectoff;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Cookie $http_cookie;
  chunked_transfer_encodingoff;
  }
  error_page   500 502 503 504/50x.html;
  location = /50x.html {
  root   html;
  }
  #rewrite
  if ($http_host !~ "^www.domain.com$") {
  rewrite^(.*)    http://www.domain.com$1 permanent;
  }
  }
  #HTTPS
  server {
  client_max_body_size 1000m;
  listen       443 ssl;
  server_name    *.domain.com;
  ssl_certificate      domain.com.crt;
  ssl_certificate_keydomain.com.key;
  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout5m;
  ssl_ciphersHIGH:!aNULL:!MD5;
  ssl_prefer_server_cipherson;
  proxy_connect_timeout 600;
  proxy_read_timeout 600;
  proxy_send_timeout 600;
  proxy_buffer_size 64k;
  proxy_buffers   4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  charset utf8;
  location /XX/ {
  limit_req zone=allips burst=10 ;
  proxy_pass http://XX/api/;
  proxy_redirectoff;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Cookie $http_cookie;
  chunked_transfer_encodingoff;
  }
  error_page   500 502 503 504/50x.html;
  location = /50x.html {
  root   html;
  }
  #https重定向
  if ($http_host !~ "^www.domain.com$") {
  rewrite^(.*)    http://www.domain.com$1 permanent;
  }
  }
  }
  备注:一般推荐上面的配置方案,就是将重定向写在每一个server中,如果只设置http的重定向,并且经常进行一个调试,则可以在后面单独配置一个server进行重定向:
  server {
  listen 80 default_server;
  server_name_;
  if ($host !~'http://^www.domain.com$') {
  rewrite ^(.*) http://www.domain.com$1 permanent;
  }
  if ($host !~ 'https://^www.domain.com$'){
  rewrite ^(.*) https://www.domain.com$1 permanent;
  }
  }
  参考链接:http://www.iyunv.net/article/24598.htm Nginx下301重定向域名的方法小结
  http://www.iyunv.net/article/69114.htm Nginx服务器中HTTP 301跳转到带www的域名的方法
  http://onlyzq.blog.51cto.com/1228/535279 关于Nginx的server_name
  http://www.cnblogs.com/inteliot/archive/2013/01/09/2853820.htmlnginx 不带www到www域名的重定向

页: [1]
查看完整版本: nginx重定向设置