我试图转发每个请求到相同的PHP脚本。
我想出了这个configuration:
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。
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脚本的位置块就足够了。
当需要执行的PHP脚本事先不知道时,不需要fastcgi_split_path_info ,只能作为URI的一部分。
另外,不需要try_files $uri =404 ,因为已知的PHP脚本已经在固定的/已知的地方可用。