我是 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 未找到页面。
我想要实现的目标是:
- 阻止不使用的直接 IP 地址访问
if
。 - 如果域名确实存在于我的数据库中,则将通配符域名重定向到我的主网站,否则返回 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,您可以引入另一个/多个服务器块。
# Second Block for all nonavailable server.
server {
listen 80 default_server;
server_name "";
return 444;
}
444 代表“连接已关闭且无响应”