![“竞争” nginx 配置文件](https://linux22.com/image/712210/%E2%80%9C%E7%AB%9E%E4%BA%89%E2%80%9D%20nginx%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.png)
我有一台使用 nginx 成功托管多个域的服务器。每个域都有一个单独的 nginx 配置文件。
一个域名,我们称之为 example.com 是默认服务器
它有一个如下的配置文件:
# config file for example.com
#
#redirects all www to NON-www
#
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80 default_server;
server_name example.com;
charset utf-8;
root /blah/example.com/public/www;
这很有效 - 直到我为同一域的文件夹和子域的各种“管理重定向”添加第二个配置文件。
我这样做是因为这个域名相当老旧,在购买域名之前,子目录中就有很多应用程序和网站。万一有些用户有旧书签,我们希望确保它们仍然有效。
我想在单独的 nginx 配置文件中维护这些重定向,以便于监督。
这是第二个配置文件(为了讨论的目的而简化):
# config file for Administrative_Redirects.example.com
#redirects Webmin and/or Panel request to proper port and https
#
server {
listen 80;
server_name webmin.example.com;
return https://webmin.example.com:10000;
}
server {
listen 80;
server_name panel.example.com;
return https://webmin.example.com:10000;
}
#------------------------------------------------------------------------
#
#redirects all Webmail and related cPanel requests to XYZ account
#
server {
listen 80;
server_name webmail.example.com;
return https://3rdPartyMail.com:port;
}
server {
listen 80;
server_name www.webmail.example.com;
return https://3rdPartyMail.com:port;
}
server {
listen 80;
server_name cpanel.example.com;
return https://AnotherDomain.com:port;
}
#------------------------------------------------------------------------
#
#redirects subdirs to proper domains and/or subdomains
#
# ~*/(regex_case-INSensitive)
server {
listen 80;
server_name example.com;
# some_app
location ~*/(some_folder)
{
return 301 $scheme://SomeOtherDomain.com;
}
# another_app
location ~*/(another_folder)
{
return 301 $scheme://AnotherDomain.com;
}
# Some_Name
location ~*/(some_name)
{
return 301 $scheme://some_name.example.com;
}
}
# strip www subdomain
server {
listen 80;
server_name www.example.com;
# some_app
location ~*/(some_folder)
{
return 301 $scheme://SomeOtherDomain.com;
}
# another_app
location ~*/(another_folder)
{
return 301 $scheme://AnotherDomain.com;
}
# Some_Name
location ~*/(some_name)
{
return 301 $scheme://some_name.example.com;
}
}
# -----------
我的两个问题:
如果“Administrative_Redirects.example.com”的这个配置文件处于活动状态,则其中的所有内容都可以正常解析,但浏览 example.com 或 www.example.com 会导致 404。
浏览 any_made-up_subdomain.example.com(即配置文件中未指定的“Administrative_Redirects.example.com”的任何内容)将提供文档根目录(即 root /blah/example.com/public/www;)...但可能会导致 404
问题似乎来自“Administrative_Redirects.example.com”配置文件中的以下部分
#-------
server {
listen 80;
server_name example.com;
#-------
and
#-------
server {
listen 80;
server_name www.example.com;
#-------
这些似乎“抢占”了 default_server 配置文件,该文件按字母顺序排列之后在活动 nginx 站点列表中。
我怎样才能防止“Administrative_Redirects.example.com”践踏 default_server nginx 配置文件?
有没有更好的方法可以做到这一点,同时在单独的文件中维护重定向?
例如,我可以将这些“管理重定向”包含到 default_server 配置文件中,这样就不会出现那么大的混乱吗?
提前感谢您的任何见解!
答案1
您应该include
在主文件中使用指令来包含重定向文件。
主要文件example.com
...
server {
listen 80 default_server;
server_name example.com;
charset utf-8;
root /blah/example.com/public/www;
# add this line
include redirects.conf;
}
然后把所有的重定向没有块server
成redirects.conf
:
# some_app
location ~*/(some_folder) {
return 301 $scheme://SomeOtherDomain.com;
}
# another_app location ~*/(another_folder) {
return 301 $scheme://AnotherDomain.com;
}
# Some_Name
location ~*/(some_name) {
return 301 $scheme://some_name.example.com;
}
注意:答案是我抱着熟睡的婴儿时在手机上输入的,因此可能会有语法错误。