使用参数重写Nginx URL(在问号之后)

时间:2018-11-30 18:07:28

标签: nginx url-rewriting nginx-location

我有以下格式的URL:

/wiki/index.php?title=Widget
/wiki/index.php?title=Blue
/wiki/index.php?title=Red
/wiki/index.php?title=Etc

我希望能够匹配任何具有模式“ /wiki/index.php?title=”或什至只是“ /wiki/index.php”的URL(但是它将使用“?”),然后将其重定向到简单的/ wiki /(与上述模式匹配的所有页面都转到单个URL / wiki /)

我曾经在/ wiki /目录中安装了一个Mediawiki,其中包含许多上述格式的页面。但是,现在我正在运行Wordpress安装,并且正在使用/ wiki /目录。我不需要每个重写的URL都可以转到不同的URL(我知道这很困难,因为我的源URL具有参数),但是现在它们都为404,所以我只想直接将它们指向/wiki/。

1 个答案:

答案 0 :(得分:1)

简单的URL重写

最简单的情况(使用任何参数重写所有/wiki/index.php请求)可以通过此配置(在server块内部)完成:

location = /wiki/index.php {
    rewrite .* /wiki/?;
}

“?”在第二个rewrite参数末尾加符号是一种技巧,它可以完全删除所有请求参数。没有它,请求/wiki/index.php?title=Widget将被重写为/wiki/?title=Widget

仅重写与/wiki/index.php?title=...匹配的请求比较复杂,如果没有if的构造,我不知道怎么做:

location = /wiki/index.php {
    if ($request_uri ~ ^/wiki/index\.php\?title=) {
        rewrite .* /wiki/?;
    }
}

如果要生成HTTP 301或302重定向而不是简单的URL重写,则可以在末尾使用redirect(用于301临时重定向)或permanent(用于302永久重定向)标志rewrite指令参数(请参见documentation)。

将URL重写到各个页面

此任务并不像看起来那样困难。要将/wiki/index.php?title=Widget重定向到/wiki/Widget,将/wiki/index.php?title=Blue重定向到/wiki/Blue等,我们可以使用map伪指令:

map $request_uri $uri_suffix {
    ~^/wiki/index\.php\?title=([^&]*) $1;
}

server {
    ...
    location = /wiki/index.php {
        rewrite .* /wiki/$uri_suffix?;
    }
    ...
}

请注意,map指令必须在您的server配置块的外部处声明!