Nginx 配置:不在丢失文件时触发回退到 /index.php

Nginx config: do not trigger fallback to /index.php on missing files

我正在为单页应用程序使用简单的 nginx 配置,该应用程序提供静态文件并将请求路由到 index.php 文件。当我编写页面访问日志系统时,发现了这个配置的问题。 发生了什么:当 try_files 没有找到文件时,它仍然运行 index.php,在应用程序初始化、数据库连接等方面浪费资源...

基本上,任何对丢失文件的请求都会触发@fallback。那么我怎样才能只重写为 PHP for /page1, /page2/suburl, 而不是 /favicon.ico?

谢谢

配置:

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

    root /var/www/;
    index index.php;
    server_name _;

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }

    location /static {
            expires 1y;
            add_header Cache-Control "public";
            access_log off;
    }

    location / {
            try_files $uri $uri/ @fallback;
    }

    location @fallback {
            #404 request for /favicon.ico still runs the index.php script
            rewrite ^ /index.php;
            add_header Cache-Control "no-store, no-cache, must-revalidate";
    }
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}

编辑: 我添加了以下修复程序,但我想用 nginx 完成此操作:

if (strpos($_SERVER['REQUEST_URI'], ".")) {
    http_response_code(404);
    return;
}

如果您不想添加一些 favicon.ico 到您的网络服务器根目录,您可以将以下位置添加到您的 nginx 配置:

location = /favicon.ico { return 404; }

如果您没有任何带有点字符的路由并且您想在 nginx 级别应用您的修复程序,您可以尝试以下操作(位置块顺序很重要,因为从第一个到第二个检查正则表达式匹配位置最后一个):

server {
    ...

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }

    location ~ \. {
        try_files $uri =404;
    }

    location ^~ /static/ {
        expires 1y;
        add_header Cache-Control "public";
        access_log off;
    }

    ...
}

^~ 位置修饰符将使您的配置工作得更快,使 nginx 跳过以 /static/ 开头的 URI 的正则表达式匹配(我在这里假设您没有 PHP 文件目录)。