php-fpm 无法与 nginx 重写配合使用

php-fpm 无法与 nginx 重写配合使用

我试图在 nginx 中重写为 PHP 文件而不更改 URL,但是 php-fpm 没有处理该文件,我得到的只是 500。

如果我删除重写并直接访问该文件,它可以工作,所以.php 文件没有错误。

server {
    listen 80;
    root /var/www/example.com/public_html;
    server_name example.com www.example.com;
    index index.html index.php;
    add_header Access-Control-Allow-Origin *;

    location ~ ^/InfoCenter/api/.*$ {
        rewrite "/InfoCenter/api/(.*)" /InfoCenter/api/index.php last;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        include fastcgi_params;
    }

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

答案1

您的信息中心位置也会捕获您正在重写的位置,因为它再次与正则表达式匹配。即,您的用户将被重写/InfoCenter/api/index.php,然后被卡在同一位置。然后永远不会发送到 PHP。

尝试将 PHP 位置更改为:

位置 ^~ .*\.php$ {
    ...
}

将位置更改为正则表达式前缀将使其优先于其他位置。

答案2

您不需要在/InfoCenter/api位置中使用正则表达式。您可以使用:

location /InfoCenter/api {
    try_files /InfoCenter/api/index.php;
}

这样就可以避免/InfoCenter再次匹配路径的问题。前缀匹配也比正则表达式匹配稍微快一些。

此外,try_files这是一种更简单的方法,可以将所有带有该前缀的请求转发到文件index.php。它实际上也不会重写 URL,这是您原始方法中存在的问题的一部分。

相关内容