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:/$1
和https://<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的主要内容,如果未能解决你的问题,请参考以下文章