如何使用try_files从URL中使用Nginx删除子目录

时间:2019-03-03 00:33:09

标签: php nginx uri

我整天都在尝试为特定问题找到解决方案。

我的结构如下:

location / {
try_files $uri $uri/ /index.php?$uri&$args;
}

现在,子目录的所有php文件也都应该在/index.php中进行解析。

location /subdir/ {
try_files $uri $uri/ /index.php?$uri&$args;
}

当我单击/subdir/thread.php?t=123时,$uri包含/subdir/thread.php?t=123。但我只想在/thread.php?t=123中只有$uri(不带子目录)。

这可能吗?我不想使用重写,因为我将此脚本用于重定向脚本。

1 个答案:

答案 0 :(得分:0)

您需要使用正则表达式来捕获URI中要传递给/index.php的部分。使用locationrewrite来实现。

使用正则表达式 location

location ~ ^/subdir(/.*)$ {
    try_files $uri $uri/ /index.php?$1&$args;
}
location ~ \.php$ { ... }

正则表达式 location块是按顺序求值的,因此该块在配置文件中的位置很重要。

要将子目录中的.php个文件发送到/index.php,您需要将此location块放置在location \.php$块的上方

有关详细信息,请参见this document


将命名为locationrewrite一起使用:

location ^~ /subdir/ {
    try_files $uri $uri/ @rewrite;
}
location @rewrite {
    rewrite ~/subdir(/.*)$ /index.php?$1 last;
}

^~运算符确保子目录中的.php个文件也被发送到/index.php

rewrite自动附加原始查询字符串。有关详细信息,请参见this document