Nginx: 子域名重定向到文件夹及其内部的文件

3
我有一个nginx重写规则 - 它将所有子域名请求从子域名重定向到文件夹:
server {
listen      x.x.x.x:80;
server_name domain *.domain;

root /home/admin/web/domain/public_html/subs/$subdomain;    # here is IF for subdomains
set $subdomain "";
if ($host ~* ^([a-z0-9-\.]+)\.domain$) {
    set $subdomain $1;
}
if ($host ~* ^www.domain$) {
    set $subdomain "";
}


index       index.php;


location / {    # here is rules for ROOT domain

root        /home/admin/web/domain/public_html;
    location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
        expires     max;
    }

它的工作效果很好,但我有一个问题。

在域名和子域名中,我使用相同的php脚本从txt文件获取数据,如下所示:

file(key.txt);

我的php-fpm模块好像不知道nginx规则,从根域名获取SUB中的数据 - 这是错误的。请帮助我添加nginx的例外或添加规则,以便从SUBs获取txt数据,而不是从根域名获取。谢谢。

重写 $request_uri $subdomain.$request_uri; 不起作用。 - Benjamin Coleman
1个回答

2
您需要在处理php文件时添加其他位置。为了简化规则,我将根目录移动到/tmp/subs/root子目录中。
server {
    listen 80;
    server_name domain.test *.domain.test;

    set $subdomain "root";
    if ($host ~* ^([a-z0-9-\.]+)\.domain.test$) {
        set $subdomain $1;
    }
    if ($host ~* ^www.domain.test$) {
        set $subdomain "root";
    }

    root /tmp/subs/$subdomain;

    location / {
        index    index.php;

         if (!-e $request_filename) {
             rewrite ^(.*)$ /index.php last;
             break;
         }
    }

    location ~ /(.+\.php) {
        index index.php;

        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_script_name;
        include fastcgi_params;
    }
}

目录结构:

/tmp/subs/root/index.php
/tmp/subs/d1/index.php
/tmp/subs/d2/index.php
/tmp/subs/d2/key.txt

/tmp/subs/d2/index.php:

<?php
    $file = file('key.txt');
    print_r($file);

/tmp/subs/d2/key.txt

hello there

谢谢。对我没用。根据您的解决方案,我已将所有文件移动到/tmp/subs/,现在服务器返回文件未找到。这是修复后的域配置文件,请问您能看到吗?https://pastebin.com/9s40VDh3。我也将其添加到了第一篇帖子中。 - Benjamin Coleman
1
@BenjaminColeman,看起来您在配置文件中添加了新的位置规则,这些规则破坏了上面的示例。为了找到问题,您可以将主要规则保留在配置文件中,然后逐个添加新的位置规则。 - Valery Viktorovsky
1
工作正常。非常感谢。 - Benjamin Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接