由于许多原因,我们不希望/不需要让用户直接访问 php。实际上我们的 php 后端大多提供 Restful API。只有一小部分代码提供一些 MVC Web。如下所述
- mywebsite.com/abcsomething.php -> 阻止它(更难破解?!)
- mywebsite.com/api/abc?xyz -> api.php(我们的 API 要点在这里)
- mywebsite.com/utility/abc?xyz -> utility.php (旧的 php 代码)
- mywebsite.com/admin/abc?xyz -> admin/admin.php (旧的 php 代码)
- mywebsite.com/everthing_else/something?xyz -> generated/index.html(其他所有内容都作为单页网站提供)
我们实际上没有index.php,但是上面描述了许多php main。
我在 Google 上搜索并尝试了将近 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 到重写、别名。但由于我缺乏经验,我设法让它工作。有人能给我一些提示吗
答案1
假设任何资源文件都不相对于同一路径,那么除了几个问题之外,您的方法是没问题的。
需要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;
}
SCRIPT_FILENAME
显然,您可以继续使用$document_root
变量作为前缀来构造,但对于硬连线值而言,这对我来说似乎毫无意义。
应该REQUEST_METHOD
在文件中定义fastcgi_params
。
编辑:
顺便说一句,我想做一些事情,比如删除“api”前缀并发送到 php。例如“/api/customer/1”-> 将仅将“customer/1”发送到 php。
您需要确定脚本使用哪个参数来读取 URI,但它将是文件中列出的变量之一fastcgi_params
(例如REQUEST_URI
)。
您可以将location
语句更改为正则表达式并捕获您感兴趣的 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;
}
确保将该块放置在任何冲突的正则表达式块之上,因为正则表达式location
块是按顺序进行评估的。