首页 > 解决方案 > Symfony 需求检查器返回 404 Not found

问题描述

我即将使用 docker 和 php-fpm 创建一个 Symfony 项目,就像本教程一样:Jobeet

我的 Symfony 正在运行,当我访问http://127.0.0.1时可以看到变化, 一切看起来都很好。

但是当我想运行 Symfony 需求检查器时,我在浏览器中从 Nginx 收到 404 Not Found 异常。

我很确定这是我的 nginx.conf 文件的问题。所以我把它贴在这里:

server {
    listen 80 default;

    client_max_body_size 520M;

    access_log /var/log/nginx/application.access.log;

    root /application/public;

    # Deny all . files
    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php-fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_index app.php;
        send_timeout 1800;
        fastcgi_read_timeout 1800;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }

    location ~ \.php$ {
        return 404;
    }

    # Statics
    location /(bundles|media) {
        access_log off;
        expires 30d;
        try_files $uri @rewriteapp;
    }
}

我猜是这部分:

location ~ \.php$ {
    return 404;
}

但是当我注释掉它时,Symfony 开始下载 PHP 文件。

这可能是什么问题nginx.conf

标签: symfonydockernginxnginx-config

解决方案


我认为问题与您的其他包含对 php-fpm 的调用的配置块有关:

location ~ ^/index\.php(/|$) {

您可以将其更改为:

location ~ ^/.+\.php(/|$) {

这将告诉 nginx 通过 php-fpm 传递对 php 文件的所有访问权限。然后,您可以删除在调用不是 index.php 的 php 脚本时引发 404 的块

location ~ \.php$ {
    return 404;
}

你的版本是 Symfony 推荐的版本,它将确保只有你的前端控制器(index.php)可以从外部访问,这对于一个新的 Symfony 项目是合理的。由于无论如何您都不应该公开check.php生产环境,因此我建议您保留生产环境的设置。

总之,这可能是您的开发配置:

server {
    listen 80;

    root /var/www/html/public;

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

    location ~ ^/.+\.php(/|$) {
        include fastcgi_params;
        fastcgi_param APP_ENV dev;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_pass php-fpm:9000;
    }
}

推荐阅读