如何阻止php扩展,同时仍然在nginx路由许多php端点

由于许多原因,我们不希望/不需要用户直接访问php。 其实我们的PHP后端大多服务于Restful API。 只有一小部分的代码服务于一些MVC网站。 如下所述

  1. mywebsite.com/abcsomething.php – >阻止它(更难以破解?!)
  2. mywebsite.com/api/abc?xyz – > api.php(我们的API要点在这里)
  3. mywebsite.com/utility/abc?xyz – > utility.php(很好的老php代码)
  4. mywebsite.com/admin/abc?xyz – > admin / admin.php(很好的老php代码)
  5. mywebsite.com/everthing_else/something?xyz – > generated / index.html(everthing else作为单个页面的网站)

我们并没有真正的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块是按顺序评估的。