Nginx - 在uwsgi_pass之前重写请求URI

27

我有一个Nginx虚拟主机的配置如下:

...
location /one {
  include uwsgi_params;
  uwsgi_pass unix:///.../one.sock;
}
location /two {
  include uwsgi_params;
  uwsgi_pass unix:///.../two.sock
}
...

当然这只是一个简化的配置

当我请求/one/something时,我希望我的Python脚本将/something作为request_uri接收。

我正在使用BottlePy,但希望Nginx处理此请求而不是由我的Python代码处理。

我可以做类似于 uwsgi_param REQUEST_URI replace($request_uri, '^/one', '') 这样的操作吗?

编辑

这里是来自我的Python代码的请求:

[pid: 30052|app: 0|req: 1/1] () {42 vars in 844 bytes} [Tue Aug 21 14:22:07 2012] GET /one/something => generated 0 bytes in 4 msecs (HTTP/1.1 200) 2 headers in 85 bytes (0 switches on core 0)

因此Python没问题,但uWSGI有问题。

如何解决呢?

4个回答

42
location /one {
  rewrite /one/(.+) /$1 break;
  include uwsgi_params;
  uwsgi_pass unix:///.../one.sock;
}

1
如果使用以下规则:rewrite /one/?(.*)$ /$1 break;,那么路由 https://<hostname>/one(没有尾随的 /)也将起作用。 - netzego
@netzego - 嗯,/one/one/都不是有效的URL,为什么要允许它呢?他们想要接收之后的/something。我不知道,只是在思考我的应用程序。 - ArtOfWarfare

3

我知道这个主题有点老了,但如果您使用uWSGI来运行Python应用程序,则还有另一种解决方法。

[uwsgi]
route-uri = ^/one/(.*) rewrite:/$1

这里的$1是什么意思? - Ken
$1 表示正则表达式中的第一次捕获,从左到右,即在本例中是 (.*). 如果您有更多的捕获,可以使用 $2、$3 等等。 - maxdebayser
尝试使用 route-uri = ^/one/?(.*)$ rewrite:/$1 进行重写,同时 https://<hostname>/one 无需斜杠也可以正常工作。 - netzego
很好的发现 @netzego - maxdebayser

1

4
你回答中提供的文档明确指出不要执行你所展示的操作(并且它说“古老的uWSGI版本曾经支持”它,这暗示它不再受支持)。 - Scott Stevens

0

我已经用另一种方式解决了这个问题:

[uwsgi]
module = wsgi:application
master = true
processes = 10
socket = 127.0.0.1:9090
mount = /one=customscript.py
manage-script-name = true

nginx

location /one {
  include uwsgi_params;
  uwsgi_pass 127.0.0.1:9090;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接