如何设置 nginx 和 fastcgi 以在子文件夹中运行 Laravel?

如何设置 nginx 和 fastcgi 以在子文件夹中运行 Laravel?

我正在单个域的子文件夹下设置多个 Laravel 应用程序(社交网络应用程序、需要 https、单个证书)。

无法弄清楚如何编写 nginx 配置以将 HTTP 请求映射到/app1/Laravel 安装/var/www/other_folder/public/

这是配置测试的最新版本。省略了调试日志。Laravel 根位置 /app1/ 有效,但路由映射 ( /app1/api/method/) 无效。请帮忙,如何逐步调试 nginx 如何处理请求(调试日志没有那么解释性),或者提示我如何将 的子文件夹映射/app1/...index.phpLaravel 的。

server {
    listen      80;
    server_name  apps.mydomain.com;
    root    /var/www/apps.mydomain.com/docs;

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

    location /app1    {
        alias   /var/www/other_folder/public;
        index   index.php   index.html;
        try_files   $uri  $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
    }

    location ~ /app1/.+\.php$ {
        rewrite ^/app1/(.*)$  /$1  break;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param    SCRIPT_FILENAME    /var/www/other_folder/public$fastcgi_script_name;

        fastcgi_index  index.php;
        fastcgi_pass php;

        #   Database access parameters
        fastcgi_param   DB_HOST "localhost";
        fastcgi_param   DB_USER "apps";
        fastcgi_param   DB_PASS "xxxxxxxx";
        fastcgi_param   DB_NAME "app1";
    }

    # Other locations skipped
    include /etc/nginx/global/php.conf; # other php scripts
}

答案1

我认为你应该更改位置的根目录。根据 Nginx 文档,root 指令还具有上下文“location”:

语法:根路径;

上下文:http,服务器,位置,如果在位置

因此您应该能够做如下的事情:

server {
    listen      80;
    server_name  apps.mydomain.com;
    root    /var/www/apps.mydomain.com/docs;

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

    location /app1    {
        root   /var/www/other_folder/public;
        rewrite ^/app1/(.*)$  /$1  break;
        index   index.php   index.html;
        try_files   $uri  $uri/ /index.php$is_args$args /index.php?$query_string;
    }

    location ~ /app1/.+\.php$ {
        root   /var/www/other_folder/public;
        rewrite ^/app1/(.*)$  /$1  break;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;

        fastcgi_index  index.php;
        fastcgi_pass php;

        #   Database access parameters
        fastcgi_param   DB_HOST "localhost";
        fastcgi_param   DB_USER "apps";
        fastcgi_param   DB_PASS "xxxxxxxx";
        fastcgi_param   DB_NAME "app1";
    }

    # Other locations skipped
    include /etc/nginx/global/php.conf; # other php scripts
}

据我了解,别名指令将 URL 重新映射到另一个 URL,然后继续处理,它没有定义源文件的目录。我不确定您是否仍需要在 PHP 位置进行重写。

答案2

此代码未经测试。但您说它适用于 /app1/ 但不适用于 /app1/api/method/ 。我猜您的问题出在这部分:

location /app1    {
    alias   /var/www/other_folder/public;
    index   index.php   index.html;
    try_files   $uri  $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
}

所以这基本上告诉去尝试url,如果不匹配,尝试将其匹配为目录url/,如果不存在文件和目录,那么我们尝试将其匹配为/app1/index.php?someargs,如果不存在,则将其匹配为/app1/index.php?$query_string

首先,别名和 try_files不能一起工作,因此您可以改用 root。将 /app1 位置块更改为以下内容,看看它是否能解决您的问题。

location /app1    {
    root   /var/www/other_folder/public;
    index   index.php   index.html;
    try_files $uri $uri/ /index.php$is_args$args;
}

其次, $query_string 与 $args 相同,唯一的区别是只读。

就像我说的,这还没有经过测试,但如果它能工作就好了。如果不行的话,我还有另一个想法。

相关内容