我正在尝试将每个请求转发到同一个 php 脚本。
我想出了这个配置:
server {
listen 80;
server_name example.com;
root /var/www/html;
index api.php;
location / {
try_files $uri /api.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index api.php;
fastcgi_pass 127.0.0.1:9000;
}
}
尽管它可以工作,但只要提供了正确的 $uri,它仍然允许直接访问资源。
如果我尝试将第一个位置块更改为如下内容:
location / {
try_files /api.php$is_args$args =404;
}
它不起作用,总是返回 404。
答案1
server {
server_name example.com;
root "/var/www/html";
location / {
include "fastcgi_params";
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
fastcgi_param SCRIPT_NAME api.php;
fastcgi_index api.php;
fastcgi_pass 127.0.0.1:9000;
}
}
如果目标是将所有请求转发到单个 PHP 脚本,并且如果该单个 PHP 脚本的名称是已知的,那么我们就不需要单独的位置块。只需一个将所有请求发送到该已知 PHP 脚本的位置块就足够了。
fastcgi_split_path_info
当需要执行的 PHP 脚本无法提前知晓并且仅作为 URI 的一部分可用时,则不需要。
而且,try_files $uri =404
由于已知的 PHP 脚本已经在固定/已知位置可用,因此不需要。