单域 Nginx 下多个项目

单域 Nginx 下多个项目

我有两个具有不同路径位置的项目,需要在单个域下配置它们,并使用单独的上游 PHP 7.1 和 HHVM。我试图使用 nginx 别名指令实现目标,但它在我指定的位置呈现 403 Forbidden。服务器内部提供的默认根目录工作正常。

server {
    listen 80;
    listen [::]:80;

    server_name site.local;
    root /srv/project1;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    #This renders a 403 forbidden
    location ~ /catalog/category/view/id {
        alias /srv/project2/public;
        index index.laravel.php;
        if (!-e $request_filename) { rewrite ^ index.laravel.php last; }
        location ~ \.laravel\.php$ {
            if (!-f $request_filename) { return 404; }
            include fastcgi_params;
            fastcgi_pass php-upstream;
            fastcgi_index index.laravel.php;
            fastcgi_param SCRIPT_FILENAME $document_root$request_filename;

        }
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass hhvm-upstream;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

HHVM 上游 当我尝试 site.local 时,hhvm 上游工作正常,并且页面成功呈现。

PHP 上游 当我尝试http://site.local/catalog/category/view/id/11 我收到 403 禁止错误,并在 nginx 错误日志中看到此错误

> site_openresty | 2018/05/21 11:34:43 [error] 6#6: *1 directory index
> of "/srv/project2/public" is forbidden, client: 172.19.0.1, server:
> site.local, request: "GET /catalog/category/view/id/11/??? HTTP/1.1",
> host: "site.local"

我已经尝试了 3 天,并尝试了 Stackoverflow、github 和 serverfault 上提供的不同解决方案,但似乎都无法解决我的问题。

答案1

发生该错误的可能原因是该文件index.laravel.php在目录中不存在/srv/project2/public

要仔细检查的第二件事是/srv/project2/public其内容的所有权和许可。

确保此目录及其文件的所有者是运行 nginx 的用户(可能是 www-data 或 nginx )。目录模式应为 755,文件模式应为 644。

编辑:

fastcgi_param SCRIPT_FILENAME $document_root$request_filename;我错过了匹配的地点的线路/catalog/category/view/id

你应该替换$request_filename$fastcgi_script_name,这样你最终会得到fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

在位置里面,您可以使用echo $document_root$fastcgi_script_name;echo $document_root$request_filename;来查看两者之间的区别。

不要忘记重新加载服务;)

相关内容