1. 处理参数

1. 处理参数

我无法理解 Nginx 重写背后的逻辑。它们应该在服务器还是位置指令中?

我需要将一个又长又吓人的 URL 重写为另一个。有谁能帮忙,或者至少给我一些资源来完成这件事?

例子:

我需要重定向这个: http://www.example.com/products.asp?category=Games&product=Glide%20SX%202012%20-%20%20Super%20Partno&utm_source=wcl-ht

变成这样: http://www.example.com/games/2xu-glid/

这可能吗?

感谢您的帮助。

答案1

1. 处理参数

尽管 Tero Kilkanen 这么说,但 nginx 完全有能力处理参数:这是通过使用argsarg_来自核心模块的变量。

2.rewrite背景

正如 Glueon 指出的那样,rewrite正如文档所述,可以在serverlocation上下文中使用。if

if是必须不惜一切代价去避免的,因此我不会在这里详细介绍它。

现在您应该使用rewriteinserver还是location

server

将按顺序考虑 s块rewrite,并使用第一个匹配的块。因此,你的配置取决于指令的顺序,这很糟糕(这是 Apache 的错误之一)。

你自己看:

rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht last;
rewrite ^/games/(?<product>[^/]+) /games.asp?product=$product&utm_source=wcl-ht last;

将重定向至products.asp, while

rewrite ^/games/(?<product>[^/]+) /games.asp?product=$product&utm_source=wcl-ht last;
rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht last;

将重定向至games.asp

根据最佳实践,最好将正则表达式路由指令(rewrite,还有 regex location)括在前缀位置内。

location

你可以将前面的示例重写为

location /games {
    rewrite ^/games/(?<product>[^/]+) /games.asp?product=$product&utm_source=wcl-ht;
}

location / {
    rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht;
}

使用前缀位置,可以确保无论你使用什么顺序,结果都会总是是相同的

3. 最低配置

这是针对您所希望的方向的最小配置。

从 2xu-glid 到 Glide%20SX%202012%20-%20%20Super%20Partno 没有明显的转换规则。如果这取决于非平凡条件和复杂检查,最好使用脚本来执行。在if不知道自己在做什么的情况下在 nginx 内部使用是危险的,可能会造成严重破坏。您还可以使用一堆嵌套位置将转换规则拆分为模块化单元。

请注意,我在这里使用单个重写,因此它不需要标志,也不需要包含在某个位置中。这是因为只有一种方式可以解析配置。

return还请注意末尾使用以确保不会尝试提供任何文件(当未找到合适的位置时,默认行为是尝试提供文件或index.html from the requested directory,具体取决于 URI 是否以 结尾/)。由于未定义root,因此将使用内部设置的默认值。

events {
    worker_connections  1024;
}


http {
    default_type  text/html;

    server {
        listen       80;

        rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht last;

        location /products.asp {
            internal;
            return 200 "Arguments: $args<br />arg_category: $arg_category<br />arg_product: $arg_product<br />arg_utm_source: $arg_utm_source";
        }

        return 404;
    }
}

相关内容