【问题标题】:Nginx rewrite to prevent PHP file direct accessNginx 重写防止 PHP 文件直接访问
【发布时间】:2018-02-17 20:17:37
【问题描述】:

我正在尝试设置一些重写,以便 (1) .com/images/* 会自然加载 (2) .com/* 将被重写为 .com/loader.php?control=* 然而,下面的代码完美运行,除了它将执行 .com/config.php 而不是将其重写为 .com/loader.php?control=config.php

如何防止我的重写被覆盖?我只希望在 loader.php 或图像文件夹中执行 .php 文件。 (已经尝试了几个小时)

server {
        listen       80;
        root /mnt/web/test_com/public_html;
        server_name test.com;
        index  index.html index.php index.htm;
        location ~ .php(.*)$ {
                fastcgi_pass  unix:/tmp/php-70-cgi.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $DOCUMENT_ROOT$fastcgi_script_name;
                fastcgi_param PATH_INFO $2;
                include fcgi.conf;
        }
        location / {
                 rewrite ^/(.*)$ /loader.php?control=$1 last;
        }
        location /images/ {
        }
}

谢谢!

【问题讨论】:

    标签: nginx url-rewriting


    【解决方案1】:

    您应该查看 try_files 指令

    与 return 和 rewrite 指令一样,try_files 指令放置在服务器或位置块中。作为参数,它需要一个或多个文件和目录的列表以及最终的 URI

    在此处阅读 nginx 博客上写的整篇博文: https://www.nginx.com/blog/creating-nginx-rewrite-rules/

    【讨论】:

    • try_files 似乎是一种查看文件是否存在并产生默认值的方法,这不是我的目标。作为我想要做的一个例子:.com/whatever 将对数据库中的“whatever”运行 SQL 搜索我只希望 /images/* 不通过 SQL 运行而直接运行问题是如果有人想搜索“config.php”,“config.php”会根据我发布的代码执行而不是重写。
    • 您似乎想要检查 /images/ 目录中是否存在图像。我会使用 try_files 来做,其他一切都应该在 php 文件中执行。还是我走远了?
    • 另外,根据您在问题中发布的配置。什么都不会到达“location /images/”,因为所有内容都将被“location /”和重写中的 (.*) 正则表达式模式拾取。
    • 我现在正在使用该实现,我可以直接打开 images 文件夹中的任何文件,没有任何问题。似乎更具体的声明,或者后面列出的声明具有优先权。不幸的是,我仍然没有找到一种方法来阻止执行应该被重写隐藏的 PHP 文件。使用 Apache 就容易多了。
    • 查看:stackoverflow.com/questions/47379091/… 您可以使用 internal 指令来使用 fastcgi 配置。因此无法直接访问 php 文件。
    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2010-09-29
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多