阻止 IP 地址访问和通配符域名 Nginx

阻止 IP 地址访问和通配符域名 Nginx

我是 Nginx 新手,我想阻止 IP 地址直接访问我的服务器,并将通配符域名重定向到我的主网站。以下是我到目前为止的原因/etc/nginx/sites-available/default

server {
    listen 80;
    listen [::]:80;
    server_name ~^(www\.)?(?<domain>.+)$;

    if ($domain != "12.13.14.15") {
        return 301 https://mainwebsite.com/$domain;
    }

    return 404;
}

上面的配置似乎一切正常,但后来我发现Nginx if 是邪恶的,同样当该域名不存在于我主网站的数据库中时,它将在 mainwebsite.com 上显示 404 未找到页面。

我想要实现的目标是:

  1. 阻止不使用的直接 IP 地址访问if
  2. 如果域名确实存在于我的数据库中,则将通配符域名重定向到我的主网站,否则返回 404 而不进行重定向。我注意到有,try_files但我不确定它是否可以用于检查外部 URL。

有人可以给我一些启发吗?

答案1

我还没有测试过,但我猜类似的东西应该可以工作

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name ~^(www\.)?(?<domain>.+)$;

    return 301 https://mainwebsite.com/$domain;

    return 404;
}

server {
    listen 80;
    listen [::]:80;
    server_name 12.13.14.15;

    return 404;
}

如果没有,您可以随时使用脚本(这里我展示的是 php,但也可以是 node-js、perl、python 等...)

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    try_files index.php =404;
}

索引.php

<?php

$domain = str_ireplace('www.', '', parse_url($_SERVER['HTTP_HOST'], PHP_URL_HOST));

if($domain == '12.13.14.15') {
    http_response_code(404);
    // include a 404 page?
    // require('404.php');
} else {
    $newURL = 'https://mainwebsite.com/'.$domain;
    header('Location: '.$newURL, 301);
}
exit();

答案2

# One Block for Main Configuration 
server {
    listen 80;
    listen [::]:80;
    server_name ~^(www\.)?(?<domain>.+)$;
    ..........
} 

笔记:我不建议在 server_name 参数中使用正则表达式。如果要将 HTTP 重定向到 httpd 或将非 www 重定向到 www,您可以引入另一个/多个服务器块。

參考文獻: Nginx 将 certbot www 重定向到非 www

# Second Block for all nonavailable server.
server {
        listen      80 default_server;
        server_name "";
        return      444;
    }

444 代表“连接已关闭且无响应”

相关内容