gpt4 book ai didi

python - `uwsgi_modifier1 30` 指令没有按照记录从 PATH_INFO 中删除 SCRIPT_NAME

转载 作者:太空狗 更新时间:2023-10-29 20:17:01 24 4
gpt4 key购买 nike

这是我的 nginx 虚拟主机配置。

debian:~# cat /etc/nginx/sites-enabled/mybox
server {
listen 8080;
root /www;
index index.html index.htm;
server_name mybox;
location /foo {
uwsgi_pass unix:/tmp/uwsgi.sock;
include uwsgi_params;
uwsgi_param SCRIPT_NAME /foo;
uwsgi_modifier1 30;
}
}

这是我的 WSGI 应用程序的源代码。

debian:~# cat /www/app.py
def application(environ, start_response):
path_info = script_name = request_uri = None

if 'PATH_INFO' in environ:
path_info = environ['PATH_INFO']

if 'SCRIPT_NAME' in environ:
script_name = environ['SCRIPT_NAME']

if 'REQUEST_URI' in environ:
request_uri = environ['REQUEST_URI']

output = 'PATH_INFO: ' + repr(path_info) + '\n' + \
'SCRIPT_NAME: ' + repr(script_name) + '\n' + \
'REQUEST_URL: ' + repr(request_uri) + '\n'

start_response('200 OK', [('Content-Type','text/plain')])
return [output.encode()]

我使用这两个命令为我的 WSGI 应用程序提供服务:

service nginx restart
uwsgi -s /tmp/uwsgi.sock -w app --chown-socket=www-data:www-data

这是我尝试访问我的 Web 应用程序时看到的输出。

debian:~# curl http://mybox:8080/foo/bar
PATH_INFO: '/foo/bar'
SCRIPT_NAME: '/foo'
REQUEST_URL: '/foo/bar'

因为我在我的 nginx 虚拟主机配置中提到了 uwsgi_modifier1 30;,所以我希望 PATH_INFO 只是 '/bar',如以下两个 URL 中所述:

引用第一篇文章相关部分:

The uwsgi_modifier1 30 option sets the uWSGI modifier UWSGI_MODIFIER_MANAGE_PATH_INFO. This per-request modifier instructs the uWSGI server to rewrite the PATH_INFO value removing the SCRIPT_NAME from it.

引用第二篇文章的相关部分:

Standard WSGI request followed by the HTTP request body. The PATH_INFO is automatically modified, removing the SCRIPT_NAME from it.

但我看到我的 PATH_INFO 保持不变,如 '/foo/bar'。 SCRIPT_NAME 部分,即 '/foo' 尚未从中删除。为什么?

最佳答案

看完https://github.com/unbit/uwsgi/pull/19我知道不推荐使用 uwsgi_modifier1 30;

这就是我解决问题的方法。

首先,我通过删除以下两行删除了 nginx 中的 SCRIPT_NAME 处理:

    uwsgi_param SCRIPT_NAME /foo;
uwsgi_modifier1 30;

生成的 nginx 配置如下所示:

debian:~# cat /etc/nginx/sites-enabled/mybox
server {
listen 8080;
root /www;
index index.html index.htm;
server_name mybox;
location /foo {
uwsgi_pass unix:/tmp/uwsgi.sock;
include uwsgi_params;
}
}

然后我重新启动了 nginx,并使用 --mount--manage-script-name 选项在 uwsgi 中处理了 SCRIPT_NAME,就像这样。

service nginx restart
uwsgi -s /tmp/uwsgi.sock -w app --chown-socket=www-data:www-data --manage-script-name --mount=/foo=/www/app.py

现在,我得到了预期的输出。

debian:~# curl http://mybox:8080/foo/bar
PATH_INFO: '/bar'
SCRIPT_NAME: '/foo'
REQUEST_URL: '/foo/bar'

关于python - `uwsgi_modifier1 30` 指令没有按照记录从 PATH_INFO 中删除 SCRIPT_NAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22642124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com