在回溯到index.php的位置内设置一个catch-all


2

我正在努力使用nginx配置。我有一个server块我想要所有请求去index.php?tags=$uri,除非$uri存在(像index.php?a=b/?a=b)。

我希望:

try_files $uri index.php?tags=$uri;

但是,不,那太简单了。这不起作用/?a=b,显然没有找到,所以它指向index.php?tags=/

也许如果我明确包含一个index,这是合理的:

index index.php;

不。没有骰子。完全相同的结果。

也没什么用$args$request_uri或组合。也不是它:

try_files $request_uri/index.php $request_uri index.php?tags=$request_uri; // now I'm just guessing

Apache总是知道我的意思。为什么不nginx?我想要这些重定向(没有redirectif):

/   => /index.php
/index.php   => /index.php
/index.php?a=b   => /index.php?a=b
/?a=b   => /index.php?a=b
/foo   => /index.php?tags=foo (or /index.php?tags=/foo)
/foo/bar   => /index.php?tags=foo/bar (or /index.php?tags=/foo/bar)
/foo?bar=yes   => /index.php?tags=/foo%3Fbar%3Dyes

我希望在重定向时对查询字符串进行编码,但不是路径,但实际上并不是那么重要。

(我也不明白$ uri和$ request_uri之间的实际区别。他们似乎在同一半时间做同样的事情。但那是另一天。)

非常感谢。

Answers:


2

我使用以下配置代码段实现了希望的结果:

location = / {
    index index.php;
}

location / {
    try_files $uri /index.php?tags=$request_uri;
}

try_files尝试...文件。当您/使用它搜索时,搜索具有相同名称的文件,它不会被解释为“查找索引文件”。index做那个工作。因此,您需要将此特殊情况与默认的后备位置分开。

最好的部分是你的最后一个愿望:参数甚至不会被编码,因为它们不需要(只有URI的第一个问号是相关的,因为无论如何,后面的所有内容都是参数)。

注意使用$request_uri(包含请求的URI,带参数,但不规范/清除它)而不是规范化$uri(清理URI并删除参数)。因此,您最终可能会:

///foo?bar=yes => index.php?tags=///foo?bar=yes

如果您介意,可以$uri结合使用$args

location = / {
    index index.php;
}

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

生产:

///foo?bar=yes => index.php?tags=/foo?bar=yes

这样location = /做了。为什么你不能把它结合在location /块内?这=意味着它只与精确的uri相匹配吗?非常感谢。他们说nginx很容易。
Rudie 2014年

location我建议您阅读的文档中对所有内容进行了彻底的解释。看看不同的修饰符。
伯纳德罗塞特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.