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的主要内容,如果未能解决你的问题,请参考以下文章

nginx配置选项try_files详解

Nginx使用try_files返回500错误的解决方案

nginx 指令之 try_files

如何缩短这个nginx try_files配置?

nginx 在 try_files 指令中有多个 PHP 文件

Nginx之try_files指令