由于许多原因,我们不希望/不需要用户直接访问php。 其实我们的PHP后端大多服务于Restful API。 只有一小部分的代码服务于一些MVC网站。 如下所述
我们并没有真正的index.php,但很多php主要描述如上。
我已经search了近4天,但无法完成。 我到目前为止:
... root /www/app; ... location ~ \.php$ { deny all; } location ^~ /api { } location ^~ /utility { fastcgi_pass 127.0.0.1:9000; fastcgi_index api.php; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ^~ /admin { root /www/app/admin fastcgi_pass 127.0.0.1:9000; fastcgi_index api.php; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { root /www/app/generated try_files $uri /index.html; } ...
#1和#5似乎工作,但#2-4我尝试了许多技术从try_files重写,别名。 但是因为我经验不足,所以我可以设法让它工作。 有人能给我一个提示
假设任何资源文件都不是相对于相同的path,除了一些问题之外,您的方法是正确的。
SCRIPT_FILENAME需要指向要执行的脚本文件(例如utility.php)。 $fastcgi_script_name的值在这种情况下是不合适的,因为它将从URI派生。
此外, fastcgi_param语句应放在include fastcgi_params; 因为后者可能包含冲突的陈述。
例如:
location ^~ /api { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /path/to/api.php; fastcgi_pass 127.0.0.1:9000; } location ^~ /utility { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /path/to/utility.php; fastcgi_pass 127.0.0.1:9000; } location ^~ /admin { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /path/to/admin.php; fastcgi_pass 127.0.0.1:9000; }
显然你可以继续使用$document_rootvariables作为前缀来构造SCRIPT_FILENAME ,但是对于硬连接的值来说,这似乎毫无意义。
REQUEST_METHOD应该在fastcgi_params文件中定义。
编辑:
顺便说一句,我想要做一些像删除“API”前缀,并发送到PHP。 像“/ api / customer / 1” – >将只发送“客户/ 1”到PHP。
您将需要确定脚本使用哪个参数来读取URI,但它将是fastcgi_params文件(例如REQUEST_URI )中列出的variables之一。
您可以将location声明更改为正则expression式,并捕获您感兴趣的URI的一部分,例如:
location ~ ^/api(?<name>.*)$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /path/to/api.php; fastcgi_param REQUEST_URI $name$is_args$args; fastcgi_pass 127.0.0.1:9000; }
请确保将块放在任何冲突的正则expression式块上方,因为正则expression式location块是按顺序评估的。