我无法理解 Nginx 重写背后的逻辑。它们应该在服务器还是位置指令中?
我需要将一个又长又吓人的 URL 重写为另一个。有谁能帮忙,或者至少给我一些资源来完成这件事?
例子:
变成这样: http://www.example.com/games/2xu-glid/
这可能吗?
感谢您的帮助。
答案1
1. 处理参数
尽管 Tero Kilkanen 这么说,但 nginx 完全有能力处理参数:这是通过使用args
和arg_
来自核心模块的变量。
2.rewrite
背景
正如 Glueon 指出的那样,rewrite
正如文档所述,可以在server
和location
上下文中使用。if
if
是必须不惜一切代价去避免的,因此我不会在这里详细介绍它。
现在您应该使用rewrite
inserver
还是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;
}
}