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

2024-05-02

这是我的 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'

既然我已经提到过uwsgi_modifier1 30;在我的 nginx 虚拟主机配置中,我期望 PATH_INFO 仅是'/bar'正如下面两个 URL 中所解释的:

  • http://uwsgi-docs.readthedocs.org/en/latest/Nginx.html http://uwsgi-docs.readthedocs.org/en/latest/Nginx.html
  • http://blog.codepainters.com/2012/08/05/wsgi-deployment-under-a-subpath-using-uwsgi-and-nginx/ http://blog.codepainters.com/2012/08/05/wsgi-deployment-under-a-subpath-using-uwsgi-and-nginx/

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

The uwsgi_modifier1 30选项设置 uWSGI 修饰符UWSGI_MODIFIER_MANAGE_PATH_INFO。这个每个请求修饰符指示uWSGI服务器重写PATH_INFO值,并从中删除SCRIPT_NAME。

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

标准 WSGI 请求后跟 HTTP 请求正文。 PATH_INFO 会自动修改,并从中删除 SCRIPT_NAME。

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


看完之后https://github.com/unbit/uwsgi/pull/19 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 并使用 uwsgi 中的 SCRIPT_NAME 处理--mount and --manage-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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`uwsgi_modifier1 30` 指令没有按照记录从 PATH_INFO 中删除 SCRIPT_NAME 的相关文章

随机推荐

  • 在同一个图表上绘制两个直方图,并将它们的列总和为 100

    我有两组不同大小的数据 我想将它们绘制在同一个直方图上 然而 由于一组有约 330 000 个值 另一组有约 16 000 个值 因此它们的频率直方图很难比较 我想绘制一个比较两组的直方图 使得 y 轴是该箱中出现的百分比 我下面的代码与此
  • 为什么没有人接受 C# 中的公共字段?

    似乎每个 C 静态分析器在看到公共字段时都会抱怨 但为什么 当然 在某些情况下 公共 或内部 field就足够了 拥有一个拥有它的财产是没有意义的get and set 方法 如果我确定我不会重新定义该字段或添加该字段怎么办 副作用很糟糕
  • Android GCM主题订阅限制

    随着 android gcm 中主题的引入 我正在评估此选项 以简化保持服务器与某些订阅同步所需要做的工作 不过我在文档中读到主题的使用仅限于 100 万个订阅 这是否意味着您不能拥有超过 100 万个用户 具有一个或多个主题 或者您只能订
  • 滚动视图内的 TabHost:单击选项卡时始终向下滚动

    我有一个 Activity 其中 Scrollview 作为顶级元素 里面还有一些其他视图 并且在某些时候还有一个 TabHost 通过查看您可能会有更好的印象截图 http img263 imageshack us img263 5329
  • 未知的 Heroku 错误

    我尝试在 heroku 上运行应用程序时遇到以下错误 2011 06 03T11 24 25 07 00 heroku nginx GET HTTP 1 1 2011 06 03T18 24 37 00 00 heroku router E
  • 在iphone应用程序中的一个线程之后调度一个线程

    我想在线程完成后安排线程 是否可以 如何 例如 指定我的需要 void connection NSURLConnection connection didReceiveData NSData data 1 response schedule
  • 无法启动客户端 Rust 语言服务器

    我正在尝试弄清楚如何使用 WSL 中的 rustc 和 Cargo 我使用 VS Code 和 Rust rls 插件 可以编译我的代码 但 RLS 存在问题 无法启动客户端 Rust 语言服务器 Rustup 不可用 安装自https w
  • 为什么 Github 操作日志显示星号?

    在 Github 操作运行器上运行时 Maven 日志输出仅显示 3 个星号 而不是实际的字符串 警告 home runner work project src test java de persistence dao DaoTest ja
  • C 中的字符计数

    我正在尝试编写一个程序来计算字符串中的所有字符 我本来有它 但后来意识到我无法计算空格 我不明白为什么这不起作用 for m 0 z m 0 m if z m charcount 任何帮助表示赞赏 编辑 如果像这样扫描输入 字符串 会有什么
  • Jenkins email-ext 会针对未按预期工作的罪魁祸首触发电子邮件

    当构建失败时 我试图向罪魁祸首发送电子邮件 如果我手动启动构建 则会发送电子邮件 但如果我通过 SCM 轮询启动构建 则不会发送电子邮件 并且构建的控制台输出会显示以下消息 An attempt to send an e mail to e
  • 如何使用 NPOI 获取包含日期的单元格的值并保留原始格式

    我有一个使用 DevExpress 编辑的 Excel 文件 并且正在使用 NPOI 阅读 当我尝试以字符串形式获取日期单元格的值时 它不会保留原始值 例如 在 DevExpress 网格中我设置了这个值 2016 08 12 我想在字符串
  • 使用 Seaborn FacetGrid 绘制相关热图

    我正在尝试创建一个带有热图的图像 分别表示每个标签的数据点特征的相关性 使用seaborn 我可以为单个类创建热图 如下所示 grouped df groupby target sns heatmap grouped get group C
  • 使用 MVC 通配符证书在 Azure 上托管许多 SSL 站点

    以下应用程序当前在我尝试迁移到 Azure 的 Windows 2008 R2 服务器上运行 Part 1 首先 我有以下 ASP NET MVC 站点 它根据 DNS 名称的第一部分路由客户 https customer1 myAzure
  • 将数字的最后 n 位转换为零

    在Python中 将数字的最后一位数字替换为零并保持前三位数字不变的最佳方法是什么 例子 23456789 gt 23400000 112022 gt 112000 1111 gt 1110 111 gt 111 no conversion
  • Python Asyncio run_forever() 和任务

    我改编了这段代码 以便在异步 Python 中使用 Google Cloud PubSub https github com cloudfind google pubsub asyncio https github com cloudfin
  • 是否可以将 Black 作为 API 调用?

    说我想用black https black readthedocs io en stable index html作为 API 并执行以下操作 import black black format some python code 通过调用格
  • 在2.0中实现SFTP

    我想在 NET 2 0 中编写SFTP 客户端和服务器 那可能吗 请给我一些建议 看一眼SharpSSH http www tamirgal com blog page SharpSSH aspx 它具有开源 BSD 风格许可证 并支持 S
  • C - 如何正确使用 OpenSSL 的 BIO_write()

    我是 OpenSSL 新手 我知道 BIO write BIO b const void buf int len 需要在循环中调用 但我不完全确定我是否正确使用它 我写了一个这样的函数 int32 t SendPacket BIO cons
  • 如何以编程方式在 Google 文档中创建文档?

    The Google 文档列表 API 的文档 http code google com apis documents overview html 好像说可以创建本地文档并上传 有没有办法实际创建和编辑文档on通过 API 的 Google
  • `uwsgi_modifier1 30` 指令没有按照记录从 PATH_INFO 中删除 SCRIPT_NAME

    这是我的 nginx 虚拟主机配置 debian cat etc nginx sites enabled mybox server listen 8080 root www index index html index htm server