【问题标题】:Serving PHP from a subdirectory using nginx + php-fpm使用 nginx + php-fpm 从子目录提供 PHP
【发布时间】:2016-09-29 00:23:46
【问题描述】:

主静态网站(镜像)位于:/home/mirrors/mirror

我正在尝试仅在子目录/home/mirrors/mirror/phpweb/ 中设置 PHP 网站。到目前为止它加载了 PHP,但是所有的图像、css 和 url 链接都指向 /home/mirrors/mirror/filename* 而不是 /home/mirrors/mirror/phpweb/filename*

我试过了:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

但这会导致错误日志显示:

在 stderr 中发送的 FastCGI:“无法打开主脚本: /home/mirrors/mirror/phpweb/phpweb/index.php

最接近工作配置的是设置路径的错误方式:

fastcgi_param SCRIPT_FILENAME /home/mirrors/mirror$fastcgi_script_name;

我忽略了什么?这是整个配置。基本上它可以工作,只是 images/css/js 没有指向 phpweb/ 目录。我的配置似乎缺少一些允许在 root /home/mirrors/mirror/phpweb;指向该文件夹。

server {
    listen       80;
    listen      443 ssl http2;
    server_name  mirrors.domain.com;
   if ($scheme = http) {
        return 301 https://$http_host$request_uri;
    }

    location / {
        root /home/mirrors/mirror;
        index index.html index.htm;
        include /home/mirrors/Nginx-Fancyindex-Theme/fancyindex.conf;
        }

    location /phpweb {
        root /home/mirrors/mirror/phpweb;
        index /phpweb/index.php;
        }


    location ~ /phpweb/.*\.php$ {
        root /home/mirrors/mirror/phpweb;
#        try_files $uri =404;
#       try_files $uri $uri/ =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /home/mirrors/mirror$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}

Here's where I found a config example.

更新:这里是更新的配置:

server {
    listen       80;
    listen      443 ssl http2;
    server_name  mirrors.domain.com;
    root /home/mirrors/mirror;
   if ($scheme = http) {
        return 301 https://$http_host$request_uri;
    }

    location / {
        index index.html index.htm;
        include /home/mirrors/Nginx-Fancyindex-Theme/fancyindex.conf;
        }

    location /phpweb {
        index /phpweb/index.php;
        }


    location ~ /phpweb/.*\.php$ {
        try_files $uri =404;
#       try_files $uri $uri/ =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#       fastcgi_param SCRIPT_FILENAME /home/mirrors/mirror/phpweb$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}

结果:

警告:包括(/home/mirrors/mirror/include/site.inc):未能 打开流:中没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 78 行

警告:include():打开失败 '/home/mirrors/mirror/include/site.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 78 行

警告:包含(/home/mirrors/mirror/include/langchooser.inc):失败 打开流:没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 81 行

警告:include():打开失败 '/home/mirrors/mirror/include/langchooser.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 81 行

警告:包括(/home/mirrors/mirror/include/ip-to-country.inc): 无法打开流:中没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 84 行

警告:include():打开失败 '/home/mirrors/mirror/include/ip-to-country.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 84 行

警告:包括(/home/mirrors/mirror/include/layout.inc):未能 打开流:中没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 87 行

警告:include():打开失败 '/home/mirrors/mirror/include/layout.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 87 行

警告:包括(/home/mirrors/mirror/include/last_updated.inc): 无法打开流:中没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 92 行

警告:include():打开失败 '/home/mirrors/mirror/include/last_updated.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/prepend.inc 在第 92 行

警告:include_once(/home/mirrors/mirror/include/releases.inc): 无法打开流:中没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/branches.inc 在第 2 行

警告:include_once():打开失败 '/home/mirrors/mirror/include/releases.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/branches.inc 在第 2 行

警告:include_once(/home/mirrors/mirror/include/version.inc): 无法打开流:中没有这样的文件或目录 /home/mirrors/mirror/phpweb/include/branches.inc 在第 3 行

警告:include_once():打开失败 '/home/mirrors/mirror/include/version.inc' 用于包含 (include_path='.:/usr/share/php:/usr/share/pear') 在 /home/mirrors/mirror/phpweb/include/branches.inc 在第 3 行

致命错误:调用未定义的函数 mirror_setcookie() 在 /home/mirrors/mirror/phpweb/index.php 在第 44 行

以前(在这篇文章中粘贴的原始配置)我们没有 php 错误并且页面加载。但是如上所述,图像/静态数据被破坏了。

【问题讨论】:

    标签: php nginx fastcgi subdirectory mirror


    【解决方案1】:

    root 指令指定以 URI 为前缀的物理路径部分,以查找物理文件。有关详细信息,请参阅this document

    所以在您发布的配置中,在我看来,root 的值在所有三个位置都应该相同:

    root /home/mirrors/mirror;
    

    事实上,在server 块中指定一次root 指令并允许它被继承到每个位置是很常见的。例如:

    root /home/mirrors/mirror;
    location / { ... }
    location /phpweb { ... }
    location ~ \.php$ { ... }
    

    【讨论】:

    • 谢谢。这就是我最初的结果,但它导致:警告:包含(/home/mirrors/mirror/include/site.inc):无法打开流:/home/mirrors/mirror/phpweb/include 中没有这样的文件或目录/prepend.inc 大约有 20 行。这意味着我必须在 PHP (php.net/mirroring.php) 提供的代码中手动设置路径。希望有一种方法可以配置 Nginx,这样 /phpweb/ 就不会被省略?刚刚恢复到您的配置建议,但只显示 PHP 错误,与页面上方的原始配置一样,但所有静态和链接都省略了 /phpweb/。 ://
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2020-08-08
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多