我正在尝试将 Nginx 中非常具体的用户代理字符串列入白名单。以下示例演示了如何将一般类型的浏览器(例如 mozilla 或 chrome)列入白名单,但我想要列入白名单的字符串/
却(
破坏了 nginx 配置。
https://gist.github.com/supairish/2951524
https://www.scalescale.com/tips/nginx/block-user-agents-nginx/
https ://www.cyberciti.biz/faq/nginx-if-conditional-http_user_agent-requests/
https ://stackoverflow.com/questions/17674293/allow-only-one-user-agent-block-the-rest-in-nginx
是否可以将以下字符串列入白名单?
if ($http_user_agent ~* (Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36) ) {
return 403;
}
答案1
正则表达式包含嵌入空格,因此应将其括起来。括号和句点在正则表达式中具有特殊含义,应使用反斜杠进行转义。正斜杠也可以。
"\(Mozilla/5\.0 \(Windows NT 10\.0; Win64; x64\) AppleWebKit/537\.36 \(KHTML, like Gecko\) Chrome/58\.0\.3029\.110 Safari/537\.36\)"
如果这是要测试的整个字符串,则可以避免使用转义的正则表达式,而改用=
带引号的字符串:
if ($http_user_agent = "..." ) { return 403; }
看这个文件了解更多信息。
顺便说一句,如果您是白名单,则测试应该是!~*
或!=
拒绝不匹配的字符串。