我需要知道如何在nginx中为某些网址格式进行代理传递
我写了以下但我不确定它是否按我的意愿工作。我想要的是
1. if the url matches '/member-chat' it needs to be redirected the proxy pass
2. anything else needs to be re-written as below
写的是正确的吗?
location ^/member-chat {
proxy_pass http://lxx.com:5280/http-bind;
}
location !/member-chat {
rewrite ^/files/([^/]+)/([^/]+)$ /_files/$1/$2;
rewrite ^/plugins/([^.]+) http://www.lxx.com:9090/plugins/$1;
}
如果我按以下方式执行此操作
location / {
rewrite ^/files/([^/]+)/([^/]+)$ /_files/$1/$2;
rewrite ^/plugins/([^.]+) http://www.lxx.com:9090/plugins/$1;
}
我收到错误
nginx: [emerg] duplicate location "/" in /var/www/vhosts/system/lxx.com
/conf/vhost_nginx.conf:4
nginx: configuration file /etc/nginx/nginx.conf test failed
答案 0 :(得分:3)
几个问题:
您的位置#1 location ^/member-chat
错误了
因为^匹配路径的开头只适用于正则表达式匹配(location ~
或location ~*
,用于区分大小写/不敏感的表达式匹配)。
执行location /member-chat
,也匹配/member-chatABCDE
或/member-chat/xyz
等位置
或使用location = /member-chat
与匹配匹配/member-chat
。
你可以也使用正常的表达式,如location ~ ^/member-chat
(前缀匹配)或location ~* ^/member-chat$
(完全匹配),但避免使用正则表达式来支持前缀甚至更精确建议匹配
(正则表达式的性能要差很多,并且在匹配过程中最后进行比较)。
位置#2是完全错误的,因为没有像not
运算符那样进行位置匹配
nginx将按特定顺序处理位置,例如它将从完全匹配(=
)开始,然后检查前缀匹配(无修饰符),然后检查正则表达式(~
或~*
)。
但是,如果找到正则表达式匹配,则它将优先于前缀匹配。
<小时/> 的结论强>
location = /member-chat {
# exact match
# proxy stuff for chat goes here
}
location /files {
# match files
}
location /plugin {
# match plugin
}