nginx url用代理传递示例重写?

时间:2014-03-12 00:50:17

标签: nginx url-rewriting proxy

我需要知道如何在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

1 个答案:

答案 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 
}


真的建议您阅读nginx docs,以防止您一个接一个地提出问题。
例如。 位置匹配是一个复杂的主题,但到目前为止,文档已经很好地涵盖了。