Nginx 忽略 server_name

Nginx 忽略 server_name

我有一个网站在 Nginx Web 服务器上运行,该服务器通过 HTTPS 运行。我最近注意到有人将他们的域名指向我的 Web 服务器,并且 Nginx 正在将我的网站提供给这个坏域名。它看起来甚至在 Google 中编入索引...

Nginx 配置:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/nginx/ssl/example.com/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;

    root /var/www/example.com;
    index index.html;
}

我尝试添加一条if语句来检查是否$host符合server_name建议这里

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/nginx/ssl/example.com/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;

      # Check if incoming hostname matches server_name 
      if ($host != $server_name) {
        # If not, return 404
        return 404;
      }

    root /var/www/example.com;
    index index.html;
}

这项添加似乎没有帮助。这一切是否正确?任何建议都将不胜感激

答案1

我有一个网站在 Nginx Web 服务器上运行,该服务器通过 HTTPS 运行。我最近注意到有人将他们的域名指向我的 Web 服务器,并且 Nginx 正在将我的网站提供给这个坏域名。它看起来甚至在 Google 中编入索引...

处理这种情况或类似情况的最佳方法是创建一个默认 catchall 服务器块。例如,以下是我必须为指向我的服务器 IP 的其他域名提供服务。

server {
    listen 80 default_server;
    server_name _;

    # deny all
    location / {
        return 403;
    }
}

我希望这能有所帮助!

答案2

创建一个万能服务器是最好的选择。您可以return 404;按照建议进行操作,或者将所有内容重定向到规范主机名;这样可以解决搜索引擎的问题。

这是我的完整配置的替代方案:

server {
    # catch-all server for both http and https
    listen *:80 default_server;
    listen *:443 default_server;
    server_name _;

    # Your SSL configuration
    ssl_certificate     /etc/nginx/ssl/example.com/ssl-bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;

    # Redirect to canonical site
    rewrite ^/(.*)$ http://example.com/$1 permanent;
}

相关内容