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

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

由于许多原因,我们不希望/不需要让用户直接访问 php。实际上我们的 php 后端大多提供 Restful API。只有一小部分代码提供一些 MVC Web。如下所述

  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(其他所有内容都作为单页网站提供)

我们实际上没有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块是按顺序进行评估的。

相关内容