Nginx - 在 uwsgi_pass 之前重写 request_uri

Posted

技术标签:

【中文标题】Nginx - 在 uwsgi_pass 之前重写 request_uri【英文标题】:Nginx - Rewrite the request_uri before uwsgi_pass 【发布时间】:2012-08-16 17:56:53 【问题描述】:

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

...
location /one 
  include uwsgi_params;
  uwsgi_pass unix:///.../one.sock;

location /two 
  include uwsgi_params;
  uwsgi_pass unix:///.../two.sock

...

当然这是一个简化的配置

当我请求 /one/something 时,我希望我的 Python 脚本以 request_uri 的形式接收 /something

我正在使用 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 => 在 4 毫秒内生成 0 个字节(HTTP /1.1 200) 2 个 85 字节的标头(核心 0 上的 0 个开关)

所以 Python 可以,但 uWSGI 不行。

如何解决?

【问题讨论】:

【参考方案1】:

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

[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;

【讨论】:

【参考方案2】:

我知道这个线程很旧,但是如果你使用 uWSGI 来运行你的 python 应用程序,还有另一种方法可以解决这个问题。

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

【讨论】:

这里的$1是什么意思? $1 表示正则表达式中的第一个捕获,从左到右,在本例中为 (.*)。如果你有更多的捕获,你可以有 2 美元、3 美元等等。 尝试route-uri = ^/one/?(.*)$ rewrite:/$1https://<hostname>/one 不带斜线,也可以, 好收获@netzego【参考方案3】:

我刚遇到同样的问题,这里有一个解决方案

location /one 
    include uwsgi_params;
    uwsgi_pass unix:///.../one.sock;
    uwsgi_param SCRIPT_NAME /one;
    uwsgi_modifier1 30;

您可以在此处找到有关uwsgi_modifier1 的更多信息: http://uwsgi-docs.readthedocs.org/en/latest/Nginx.html#hosting-multiple-apps-in-the-same-process-aka-managing-script-name-and-path-info

【讨论】:

您的答案中链接的文档现在明确说 not 做您所展示的事情(并且它说“用于支持的古代 uWSGI 版本”,表明它不是支持更长时间)。【参考方案4】:
location /one 
  rewrite /one/(.+) /$1 break;
  include uwsgi_params;
  uwsgi_pass unix:///.../one.sock;

【讨论】:

如果使用这条规则:rewrite /one/?(.*)$ /$1 break;,路由https://<hostname>/one(没有尾随/)也可以。 @netzego - 嗯,/one/one/ 都不是有效的 URL,为什么要允许呢?他们希望最终收到随后的/something。 IDK,现在只想着我自己的应用程序。

以上是关于Nginx - 在 uwsgi_pass 之前重写 request_uri的主要内容,如果未能解决你的问题,请参考以下文章

nginx +uwsgi + django配置

Nginx的配置3

Nginx集群模块

Nginx + uwsgi 时,替换路径。

Nginx自学手册 upstream及fastcgi

毕业设计:文献参考