在url中制作nginx检查参数
Posted
技术标签:
【中文标题】在url中制作nginx检查参数【英文标题】:Making nginx check parameter in url 【发布时间】:2014-07-22 04:56:02 【问题描述】:我想检查一个参数是否存在于 nginx 的 url 中,然后重写。我该怎么做?
例如,如果 url 是 http://website.com/?mobile
,则将用户重定向到 http://m.website.com
【问题讨论】:
如果可以的话,尽量使用一些值。检查参数是否具有某些值很简单if ($arg_mobile)
。检查是否有空参数mobile
不是那么清晰且容易出错。
@AlexeyTen 你能用一个例子把它作为答案发布吗...我以前从未使用过参数
【参考方案1】:
你最好使用http://example.com/?mobile=1
(带有值的参数)。在这种情况下,检查很简单:
if ($arg_mobile)
return 302 http://m.example.com/;
检查参数是否存在通常使用if ($args ~ mobile)
之类的正则表达式完成,但它很容易出错,因为它会在任何地方匹配mobile
,例如http://example.com/?tag=automobile
.
【讨论】:
我需要做的就是将上面的代码添加到我的 nginx 配置文件中。nginx 是否已经知道$arg_mobile
将检查?mobile-1
。
(=) — 等号,而不是 (-) 连字符。它将检查mobile=pretty-anything
除了0
(零)和空参数。
我得到了 nginx: [emerg] unknown directive "if($arg_querystringkey)" 版本 nginx/1.12.2。这不再支持了吗?
@raksja 尝试在“if”之后添加空格
感谢@AlexeyTen,它成功了。我在这里有一个关于动态 proxy_pass 变量的后续问题,你能看看nginx dynamic proxy pass variable【参考方案2】:
如果你知道你只有1个参数variable
可以切换,你可以像这样检测是否存在
if ($request_uri ~ '\?variable')
...
例如
if ($request_uri ~ '\?mobile')
return 302 https://m.example.com;
另外我建议考虑使用这个重定向
http://domain.tld/mobile
-> http://m.domain.tld
location ~ '/mobile'
return 301 'https://m.domain.tld';
例如
location ~ '/mobile'
return 301 'https://m.example.com';
【讨论】:
【参考方案3】:你可以试试这个来匹配你的参数
if ($args ~ '\bmobile[=&]?' )
return 302 http://m.example.com/;
因为这将匹配 $args 中任何位置的“mobile”,无论有无价值。
【讨论】:
以上是关于在url中制作nginx检查参数的主要内容,如果未能解决你的问题,请参考以下文章
从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 'from' 的参数”