8
回答
nginx server_name怎么可有可无
华为云数据库免费试用   

以前我发现nginx  server_name写错了进不去网站:但昨天发现随便写个错误域名或者干脆不写都能访问网站:

我是参考http://www.oschina.net/code/snippet_12_175 配的:@红薯

http
{
  include       mime.types;
  default_type  application/octet-stream;
  server_tokens off;
  #charset  gb2312;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;

  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 60;
  tcp_nodelay on;
  proxy_redirect          off;
  proxy_set_header        Host $host;
  proxy_set_header        X-Real-IP $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_connect_timeout   300;
  proxy_send_timeout      300;
  proxy_read_timeout      300;
  proxy_buffer_size       4k;
  proxy_buffers           4 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;

  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

server {
        listen       80;
        server_name www.oschina112233.com;  //这里随便写域名或者 删除 server_name都能正常访问

        access_log  logs/access.log  main;

        location / {
           auth_basic  "say frend and pass!";
           auth_basic_user_file /home/nginxpasswd/localpasswd/visitpass;
           proxy_pass http://127.0.0.1:10697;
        }



怎么回事?是不是一个server可以不写server_name

举报
小猫王
发帖于6年前 8回/33K+阅
共有8个答案 最后回答: 2年前
如果nginx中只配置一个server域的话,则nginx是不会去进行server_name的匹配的。因为只有一个server域,也就是这有一个虚拟主机,那么肯定是发送到该nginx的所有请求均是要转发到这一个域的,即便做一次匹配也是没有用的。还不如干脆直接就省了。如果一个http域的server域有多个,nginx才会根据$hostname去匹配server_name进而把请求转发到匹配的server域中。此时的匹配会按照匹配的优先级进行,一旦匹配成功进不会再进行匹配,关于具体的匹配规则可以参见nginx官网提供的文档。
--- 共有 2 条评论 ---
wang_wei实际上,nginx会匹配请求头中的host和server_name,如果没有匹配的上,nginx会指定该请求到一个默认的server域,如果比较说明,默认的server为第一个server。因此,就出现了如楼主所述的情况。 6年前 回复
小猫王谢谢 6年前 回复

引用来自“Jewel_M”的答案

我的理解是   如果不写的话  会默认绑定所有IP  如 127.0.0.1
server {
        listen       80;

        server_name 123123123123;//随便写都可以,相当于没去匹配server_name

       }

不是缓存问题,是没去匹配server_name???

我再查查 是不是 只有一个server执行默认的 server

刚试验了下:

我只配了一个server,所有没写server_name或者乱写域名都可以访问

有多个server   nginx会去匹配server_name名称

引用来自“万里码”的答案

刚试验了下:

我只配了一个server,所有没写server_name或者乱写域名都可以访问

有多个server   nginx会去匹配server_name名称

原来是这样...

            listen  80 default;

            server_name  www.test.com;


多个的话用 default

哈哈   试试


顶部