nginx 位置无初始路径组件

nginx 位置无初始路径组件

我有一个如下所示的位置块:

root /var/www/ProjectP;

location /p/ {
    index index.php;
    try_files $uri $uri/ =404;
}

location ~ /p/.*\.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

为了实现这一点,我创建了一个目录/var/www/ProjectP/p/,这是一个糟糕的黑客行为,因为它将项目在 http 空间中的位置信息与项目一起提供,而不是与 nginx 一起提供。Nginx 配置应该能够将其移动到而/pp/无需修改项目 P。

这个特定的项目没有proxy_pass指令,但接下来会发生这种情况,然后我的黑客就不太可能奏效。

我确信 nginx 有正确的方法来处理如此常见的问题,但我还没有找到。有什么建议吗?

更新 1

正如@RichardSmith所说,正确的方法肯定是别名指令。在静态内容上测试这个效果很好:

location /a/ {
    alias /var/www/ProjectA/;
    index index.html;
    try_files $uri $uri/ =404;
}

当我对 php 代码执行相同操作时,我获得了一半的成功:

location /p/ {
    alias /var/www/ProjectP/;
    index index.php;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ /p/(.+\.php)$ {
    alias /var/www/ProjectP/$1;
    include snippets/fastcgi-php.conf;

    # With php7.0-fpm:
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    ## These next are largely set via snippets/fastcgi-php.conf.
    ## Trying them here doesn't help, but I leave them (commented out)
    ## for the moment...
    #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #include fastcgi_params;
    #fastcgi_param SCRIPT_FILENAME $uri;
}

针对非 php 文件进行测试,我确认第一个块可以工作。但第二个块不行,因此 php 文件无法正常使用。(我得到 404。)我尝试了最后注释掉的 fastcgi 指令的几个变体,但显然不是正确的组合。

更新 2

这有效。

root /var/www/;

location /p/ {
    alias /var/www/ProjectP/;
    index index.php;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;

    # Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;

        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

答案1

您的区块至少存在一个问题location

如果您要求http://www.example.com/p/test.php,变量的内容$1将是test.php

这意味着你的

alias /var/www/ProjectP/$1;

将使文档根目录为/var/www/ProjectP/test.php

然后,

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

定义发送给 PHP 进程来定位文件的实际文件路径。$document_root包含alias此转换中的路径,并$fastcgi_script_name包含来自请求的文件名。

因此,您这种情况的最终结果是,请求http://www.example.com/p/test.php最终到达 PHP 进程的文件名/var/www/ProjectP/test.phptest.php。因此将返回404

解决方法是使用:

alias /var/www/ProjectP

在 PHPlocation块中。

答案2

这有效。

root /var/www/;

location /p/ {
    alias /var/www/ProjectP/;
    index index.php;

    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;

    # Pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;

        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

相关内容