在Apache中,可以使用.htaccess
示例文件夹结构:
/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;
}
?
答案 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
好。
好的。得到了赏金,但继续感到我错过了一些东西,而您的查询实际上并未得到解决。阅读和重读之后,我现在认为我终于完全理解了您的查询。
您要检查目标文件夹中的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;
}