Nginx“ try_files”中的级联index.php

时间:2018-09-04 09:40:44

标签: apache .htaccess nginx url-rewriting

在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 个答案:

答案 0 :(得分:3)

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;
}