首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置/folder的路径与/

配置/folder的路径与/
EN

Stack Overflow用户
提问于 2020-06-03 17:06:21
回答 1查看 1K关注 0票数 0

我有一个问题,运行/folder从不同的途径,而不是主要的网站。

该部分的nginx.conf如下所示:

代码语言:javascript
复制
        location ~ \.php$ {
            try_files               $uri = 404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param       SCRIPT_FILENAME $request_filename;
            fastcgi_pass            unix:/var/run/php/php7.2-fpm.sock;
            fastcgi_index           index.php;
           include                 fastcgi_params;
            include                 fastcgi.conf;
    }


location ~ /folder {
        alias /srv/http/folder;
    try_files $uri $uri/ @folder;

    location ~ \.php$ {
                fastcgi_param SCRIPT_FILENAME $request_filename;
                fastcgi_pass   unix:/var/run/php/php7.2-fpm.sock;
                include        fastcgi.conf;
        }
}

location @folder {
    rewrite /folder/(.*)$ /folder/index.php?/$1 last;
}

在error.log中,我可以看到以下内容:

代码语言:javascript
复制
2020/06/03 09:05:26 [error] 25966#25966: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.21.2.46, server: example.com, request: "GET /folder/xxx_v6.15.11/Resources/images/redcaplogo.gif HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "example.com"

有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 17:28:37

Regex位置从第一个匹配到最后,第一个找到的匹配由nginx处理。当您收到/folder/script.php请求时,它将由第一个location块处理。试着换掉这两个地点。另外,为什么在第二个位置块中不包括fastcgi_params

更新

我做了一些调试,让我们看看您的代码(假设位置块已经被交换):

代码语言:javascript
复制
location ~ /folder {
    alias /srv/http/folder;
    try_files $uri $uri/ @folder;

    location ~ \.php$ {
        fastcgi_param  SCRIPT_FILENAME $request_filename;
        fastcgi_pass   unix:/var/run/php/php7.2-fpm.sock;
        include        fastcgi_params;
        include        fastcgi.conf;
    }
}

location ~ \.php$ {
    try_files               $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param           SCRIPT_FILENAME $request_filename;
    fastcgi_pass            unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_index           index.php;
    include                 fastcgi_params;
    include                 fastcgi.conf;
}

location @folder {
    rewrite /folder/(.*)$ /folder/index.php?/$1 last;
}

如果我们得到一个请求/folder/some/path (并且folder中没有some/path文件或目录),那么嵌套位置内部的nginx变量将有以下值:

  • $request_filename:空字符串(在folder目录中没有真正的文件或文件夹/some/path );
  • $uri/folder/check.php
  • $document_root/srv/http/folder.

如果我们得到一个请求/folder/some/path/script.php (并且有一个真正的具有此名称的PHP脚本),那么在嵌套位置内部的nginx变量中将有以下值:

  • $request_filename/srv/http/folder/some/path/script.php
  • $uri/folder/some/path/check.php
  • $document_root/srv/http/folder.

此外,当您从文件夹(例如/folder/some/path/static.css )获得静态资源请求时,try_files $uri ...指令将在/srv/http/folder目录中搜索folder/some/path/static.css文件,这将导致检查/srv/http/folder/folder/some/path/static.css文件的存在。

folder目录中获取文件子路径的可能解决方案之一是:

代码语言:javascript
复制
location ~ ^/folder(?<subpath>.*) {
    alias /srv/http/folder;
    try_files $subpath $subpath/ @folder;

    location ~ \.php$ {
        fastcgi_param  SCRIPT_FILENAME $document_root$subpath;
        fastcgi_pass   unix:/var/run/php/php7.2-fpm.sock;
        include        fastcgi_params;
        include        fastcgi.conf;
    }
}

location ~ \.php$ {
    try_files               $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param           SCRIPT_FILENAME $request_filename;
    fastcgi_pass            unix:/var/run/php/php7.2-fpm.sock;
    fastcgi_index           index.php;
    include                 fastcgi_params;
    include                 fastcgi.conf;
}

location @folder {
    rewrite ^/folder/(.*)$ /folder/index.php?/$1 last;
}

如果您的实际folder目录名称与/folder URI前缀相同,则可以简化此操作:

代码语言:javascript
复制
location ~ ^/folder {
    root /srv/http;
    try_files $uri $uri/ @folder;

    location ~ \.php$ {
        fastcgi_param  SCRIPT_FILENAME $document_root$uri;
        fastcgi_pass   unix:/var/run/php/php7.2-fpm.sock;
        include        fastcgi_params;
        include        fastcgi.conf;
    }
}

...

作为nginx文档

当位置与指令值的最后一部分匹配时: 位置/图像/{别名/数据/w3/图像/;} 最好使用根指令,而不是: 位置/图像/{ root /data/w3;}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62178581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档