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 文件目录)。
我正在为单页应用程序使用简单的 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 文件目录)。