首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当访问除index.php文件以外的php文件时,如何返回404?

当访问除index.php文件以外的php文件时,如何返回404?
EN

Stack Overflow用户
提问于 2021-10-26 04:01:20
回答 1查看 60关注 0票数 0

我通过一个index.php文件路由所有的东西。我不想让任何人直接访问我的/var/www/html目录中的php文件,除了index.php。

我有这个来禁用对php文件的访问:

代码语言:javascript
运行
复制
location ~ /*.php {
    return 404;
}

但不幸的是,我的index.php文件仍然得到了404。

我使用以下代码通过index.php路由所有内容:

代码语言:javascript
运行
复制
location / {
    try_files $uri $uri/ /index.php?$args;
}

我怎样才能让这两者同时工作呢?

EN

Stack Overflow用户

回答已采纳

发布于 2021-10-26 04:53:28

在您的配置中,对于任何包含php子字符串的请求,都没有找到HTTP404:

代码语言:javascript
运行
复制
'/*' + '.' + 'php'
 |      |      |
 |      |      +--- 'php' substring
 |      +---------- any single char
 +----------------- 0 or more '/' chars

我不认为这真的是你写的那个意思。匹配任何以.php结尾的正则表达式模式的正确正则表达式模式是\.php$模式。有关其他信息,请检查PCRE正则表达式模式语法。

要匹配除index.php之外的所有PHP文件,您可以使用精确匹配位置(它优先于正则表达式匹配位置):

代码语言:javascript
运行
复制
location / {
    try_files $uri $uri/ /index.php?$args;
}
location = /index.php {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_pass <your_PHP-FPM_backend>;
}
location ~ \.php$ { # will be used for any PHP request except 'index.php'
    return 404;
}

使用^~位置修饰符可以实现相同的效果。如果最长匹配前缀位置具有^~修饰符,则不检查正则表达式:

代码语言:javascript
运行
复制
location / {
    try_files $uri $uri/ /index.php?$args;
}
location ^~ /index.php {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_pass <your_PHP-FPM_backend>;
}
location ~ \.php$ { # will be used for any PHP request except 'index.php'
    return 404;
}

如果您在不同的目录中有多个index.php文件,则以前的解决方案将不起作用,您需要使用两个正则表达式匹配位置:

代码语言:javascript
运行
复制
location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
}
location ~ /index\.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_pass <your_PHP-FPM_backend>;
}
location ~ \.php$ { # will be used for any PHP request except 'index.php'
    return 404;
}

这是唯一一个位置块顺序很重要的配置。location ~ /index\.php$ { ... }应该是第一个,否则任何PHP文件请求都将被location ~ \.php$ { ... }文件阻塞。

有关更多信息,请查看location指令descriptionHow nginx processes a request文档页面。您还可以查看Nginx redirect all traffic to index.php, but don't allow arbitrary file access SO thread,以获得其他一些示例。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69717335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档