nginx "try_files" 中的级联 index.php
Posted
技术标签:
【中文标题】nginx "try_files" 中的级联 index.php【英文标题】:Cascade index.php in nginx "try_files" 【发布时间】:2019-02-09 07:30:52 【问题描述】:在 Apache 中,可以使用 .htaccess
将所有内容重定向到最近的 index.php
示例文件夹结构:
/Subdir
/index.php
/.htaccess
/Subdir
/Subdir/.htaccess
/Subdir/index.php
如果我访问/something
,它将重定向到根index.php,如果我访问/Subdir/something
,它将重定向到Subdir/index.php
这也可以在 nginx 中完成吗?
这应该是可能的,因为在 nginx 文档中它说If you need .htaccess, you’re probably doing it wrong
:)
我知道如何将所有内容重定向到根 index.php:
location /
try_files $uri $uri/ /index.php?$query_string;
但是如何检查每个父目录中的 index.php 直到 /
?
编辑:
我发现这些规则做我想做的事:
location /
try_files $uri $uri/ /index.php?$query_string;
location /Subdir
try_files $uri $uri/ /Subdir/index.php?$query_string;
但是有没有办法让它抽象,比如
location /$anyfolder
try_files $uri $uri/ /$anyfolder/index.php?$query_string;
?
【问题讨论】:
【参考方案1】:index 指令应该处理大部分内容
server
index index.php;
...
如果您的设置要求使用 try_files,那么这应该适合您:
location /
try_files $uri $uri/ $uri/index.php?$query_string =404;
您还可以捕获位置并将其用作变量:
location ~ ^/(?<anyfolder>)
# Variable $anyfolder is now available
try_files $uri $uri/ /$anyfolder/index.php?$query_string =404;
编辑
我从您的评论中看到,您想先尝试主题文件夹的 index.php 文件,如果主题文件夹中没有,则继续使用根文件夹中的文件。
为此,您可以尝试类似...
location /
try_files $uri $uri/ $uri/index.php$is_args$args /index.php$is_args$args;
注意:$is_args$args
比 ?$query_string
更好,如果有可能没有争论的话。
编辑 2
好的。得到了赏金,但一直觉得我错过了一些东西,而且您的查询实际上没有得到解决。经过反复阅读,我现在认为我终于完全理解了您的问题。
您想检查目标文件夹中的 index.php。如果找到,这将被执行。如果没有找到,请继续在目录树上检查父文件夹,直到找到一个(可能是根文件夹)。
我在上面的“编辑”中给出的答案只是跳转到根文件夹,但您需要先检查中间文件夹。
未测试,但您可以尝试递归正则表达式模式
# This will recursively swap the parent folder for "current"
# However will only work up to "/directChildOfRoot/grandChildOfRoot"
# So we will add another location block to continue to handle "direct child of root" and "root" folders
location ~ ^/(?<parent>.+)/(?<current>[^\/]+)/?
try_files /$current /$current/ /$current/index.php$is_args$args /$parent;
# This handles "direct child of root" and "root" folders
location /
try_files $uri $uri/ $uri/index.php$is_args$args /index.php$is_args$args;
【讨论】:
谢谢。如果我删除结尾=404
,它会起作用。也许你误解了我的问题。我想准确地模仿 Apache 的行为。因此,如果有一个带有 index.php
文件的子文件夹,则将以子文件夹名称开头的每个请求重定向到该脚本,否则重定向到父 index.php
更新答案以捕获查询意图
谢谢。实际上我现在只需要 2 个级别 :)以上是关于nginx "try_files" 中的级联 index.php的主要内容,如果未能解决你的问题,请参考以下文章