使用相同根目录的Nginx虚拟目录会显示404错误

时间:2018-11-15 20:33:04

标签: nginx

我对Nginx还是很陌生,我正尝试从Apache导入旧站点。我想摆脱虚拟目录,但不幸的是我不能。

虚拟目录指向主站点上的相同根。代码中包含逻辑,可检测虚拟目录并根据该信息加载数据,这就是为什么存在虚拟目录的原因。

这是我要开始使用的配置:

server {
    listen 80;

    large_client_header_buffers 4 32k;

    server_name site.domain.com;

    access_log /var/log/sites/site.access.log;
    error_log /var/log/sites/site.error.log error;


    location / {
        root /var/www/php/site;
        index index.php;
        include /etc/nginx/conf.d/php.inc;
    }

    location /sitea {
        root /var/www/php/site;
        index index.php;
        include /etc/nginx/conf.d/php.inc;
    }

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

php.inc的内容:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;

    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;

    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

我已经尝试过Google必须提供的所有方法才能使它正常工作,但是无论我做什么我都会继续遇到以下错误:

2018/11/15 20:28:32 [debug] 5056#5056: *1 http script var: "/sitea/index.php"
2018/11/15 20:28:32 [debug] 5056#5056: *1 trying to use file: "/sitea/index.php" "/var/www/php/site/sitea/index.php"
2018/11/15 20:28:32 [debug] 5056#5056: *1 trying to use file: "=404" "/var/www/php/site=404"
2018/11/15 20:28:32 [debug] 5056#5056: *1 http finalize request: 404, "/sitea/index.php?requestType=home" a:1, c:1
2018/11/15 20:28:32 [debug] 5056#5056: *1 http special response: 404, "/sitea/index.php?requestType=home"
2018/11/15 20:28:32 [debug] 5056#5056: *1 http set discard body
2018/11/15 20:28:32 [debug] 5056#5056: *1 xslt filter header
2018/11/15 20:28:32 [debug] 5056#5056: *1 HTTP/1.1 404 Not Found

任何对正确方向的帮助将不胜感激。

注意:使用aliasroot

时,它也做同样的事情

使用别名,我得到以下信息:

  

2018/11/15 20:37:38 [错误] 5189#5189:* 1在stderr中发送的FastCGI:   从上游读取响应标头时出现“主脚本未知”,   客户端:#。#。#。#,服务器:site.domain.com,请求:“获取   /sitea/index.php?requestType=home HTTP / 1.1“,上游:   “ fastcgi:// unix:/run/php/php7.0-fpm.sock:”,主机:“ site.domain.com”

可能的解决方案

我不确定这是否是正确的方法,但确实有效。

如果我在站点加载的主文件夹中为虚拟目录创建了符号链接。我宁愿在Nginx中这样做,但是如果我必须走这条路线,我会的。有想法吗?

1 个答案:

答案 0 :(得分:1)

root伪指令通过将文件的值与当前URI进行简单的串联来构造文件的路径。因此,您的第二个位置块正在/var/www/php/site/sitea/index.php处寻找文件。

前缀位置中的alias伪指令将前缀文本替换为alias值。有关更多信息,请参见this document

location /sitea {
    alias /var/www/php/site;
    ...
}

因此,上面的位置块将在/sitea/index.php处查找URI /var/www/php/site/index.php

rootalias伪指令都将名为$request_filename的变量设置为文件路径。

在您的PHP块中,您使用$document_root$fastcgi_script_name通知PHP-FPM文件路径。这适用于root,但不适用于alias

fastcgi_param SCRIPT_FILENAME $request_filename;

对于不处理路径信息(例如您的路径信息)的PHP块,上面的方法同时适用于rootalias