子域和使用 nginx 重定向

Posted

技术标签:

【中文标题】子域和使用 nginx 重定向【英文标题】:Subdomains and redirecting with nginx 【发布时间】:2014-05-12 04:13:45 【问题描述】:

我在 example.com 上设置了我的博客

server 
    listen   8082; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name example.com;

并从 www 重定向。对于非 www 我也有这个块:

server 
    listen      8082;
    server_name www.example.com;
    return          301 http://example.com$request_uri; 

这也有效,但后来我想添加一个子域:“api.example.com”。首先,我尝试在可用站点中添加另一个文件并符号链接到已启用站点。但这不起作用,第二个文件根本没有触发。

接下来,我将子域作为服务器块添加到第一个文件中。那行得通。但是现在每个子域都指向 api.example.com。

首先我不明白“test.example.com”如何导致这个服务器块:

server 
    listen   8082; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name api.example.com;

因为 server_name 是 api.example.com,而 test.example.com 是另一个子域。以及如何让每个未指定的子域都指向主页或自定义错误页面?

【问题讨论】:

在我添加最后一个块之前,无论我输入什么子域,重定向块都会启动。 那么/sites-enabled/ 文件夹中有两个文件(链接)? 不,现在所有 3 个服务器块都在一个文件中,只有一个处于活动状态。 【参考方案1】:

首先,将您的 3 个域/子域服务器块分成三个不同的文件可能是组织的更好做法。据我了解,您的 nginx 配置为从启用站点的读取 .conf 文件。创建从启用站点到可用站点的链接的可能性只是让您在需要时轻松禁用子域/子域,而无需删除配置文件(您只需删除符号链接)。这很好。但是您的配置可能有问题。您可以从这个示例 nginx.conf (source) 中尝试:

# Generic startup file.
user user group;

#ususally equal to number of CPU's you have. run command "grep processor /proc/cpuinfo | wc -l" to find it
worker_processes  2;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

# Keeps the logs free of messages about not being able to bind().
#daemon     off;

events 
    worker_connections  1024;


http 
#   rewrite_log on;

    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
#   tcp_nopush         on;
    keepalive_timeout  3;
#   tcp_nodelay        on;
#   gzip               on;
        #php max upload limit cannot be larger than this       
    client_max_body_size 13m;
    index              index.php index.html index.htm;

    # Upstream to abstract backend connection(s) for PHP.
    upstream php 
                #this should match value of "listen" directive in php-fpm pool
        server unix:/tmp/php-fpm.sock;
#       server 127.0.0.1:9000;
    

    include sites-enabled/*;

如果您不想/不需要更改所有 nginx.conf 文件,只需查看最后一行(包含)。

然后,只需在启用站点的情况下创建每个服务器 (vhost) 配置文件。

关于配置子域的问题,请确认您正在为子域创建相应的 DNS 条目。这是显而易见的,但请仔细检查,因为您的 nginx 配置似乎是正确的。然后,使用不同的文件创建服务器块:

server 
    listen   8082; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    server_name api.example.com;
    #the rest of your server config goes here.


【讨论】:

我不确定该 DNS 部分,但我的域指向我的服务器,因此该部分可以正常工作。 nginx服务器块的顺序重要吗? 如果您在从终端运行“ping subdomain.domain.com”时将服务器 IP 作为响应,那就没问题了。顺序无关紧要。但是,当您使用外部 conf 文件时,将没有顺序,只有一些“服务器虚拟主机”外部文件。请使用我的回答中的建议。我使用 nginx 已经快 3 年了,我总是按照我的建议配置子域——所以我可以确认这将完全符合您的要求。 ;) 我按照您的示例进行操作,现在它可以处理多个文件,唯一不起作用的是,如果我转到“test.example.com”或其他任何内容,nginx 会显示 api 文件。例子.com。我可以创建一个 *.example.com 吗?除了指定的子域之外,它会需要任何东西吗? 让我看看我是否理解:当你输入test.example.com时,使用的配置文件是api.example.com的配置文件?确认所有服务器文件都定义了“server_name”。如果你有 example.com、api.example.com 和 test.example.com,就会有三个文件。并为每个文件定义一个服务器块,其中 server_name 定义为域地址(这是 nginx 将侦听的地址)。 我现在有 3 个服务器块,api.example.com(在一个文件中)和 example.com + 从 www.example.com 到 example.com 的重定向块在另一个文件中。重定向块只有 4 行,所以我认为让它站在主块旁边是有意义的。问题在于,对于每个其他子域 [randomtext].example.com,api.example.com index.php 都会被提供。

以上是关于子域和使用 nginx 重定向的主要内容,如果未能解决你的问题,请参考以下文章

Dockerized Nginx将不同的子域重定向到同一页面

Nginx 将子域转换为路径组件而不进行重定向

反向代理将 url 重定向到子域

NGINX重定向所有请求将URL与参数匹配到子域

使用 nginx 重定向某个域的所有流量

在子域允许访问一个页面,如果试图访问其他页面重定向到主域名