【问题标题】:nginx $document_root not evaluating root directive regexnginx $document_root 不评估根指令正则表达式
【发布时间】:2016-03-03 08:51:29
【问题描述】:

我的目标是拥有通配符子域,每个子域都从自己的目录中提供 php。例如,“www”子域从“public_html/www”提供服务,“blog”从“public_html/blog”提供服务。这是我当前的 nginx 配置,它允许它部分工作:

server {
    listen      80;
    server_name ~^(.*)\.example\.com$;

    root        /var/www/example.com/public_html/$1;
    index       index.php index.htm;

    location ~ \.php$ {
        fastcgi_split_path_info         ^(.+\.php)(/.+)$;
        fastcgi_pass    unix:/var/run/php5-fpm.sock;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
}

为了测试,我在www目录中有一个index.php,在blog目录中有一个index.htm。博客子域工作正常,并显示博客目录中的 index.htm。

但是,www 子域不起作用,页面返回“未指定输入文件”。如果我将“www”硬编码到根指令而不是“$1”,它适用于“www”子域,但当然博客也会显示该内容。

因此,似乎 php 特定位置内的 $document_root 并未评估代表子域的根指令的 $1。使用 $document_root 时需要更改什么或如何确保评估根?

【问题讨论】:

    标签: nginx


    【解决方案1】:

    尝试使用命名捕获而不是数字捕获。

    server_name ~^(?<subsystem>.+)\.example\.com$;
    root        /var/www/example.com/public_html/$subsystem;
    

    也许root 被评估较晚(我不知道)并且$1location 正则表达式覆盖。

    【讨论】:

    • 看起来是这样做的!稍后我将继续进行进一步的测试,但就目前而言,仅此更改就消除了错误并显示了我的内容。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2019-11-01
    相关资源
    最近更新 更多