【问题标题】:Nginx changing pathNginx 改变路径
【发布时间】:2023-04-02 11:53:02
【问题描述】:

我一直在网上搜索 nginx 文档和帖子,但找不到答案。

我正在运行一个 python 应用程序,我希望稍微改变其中的一个路径。由于各种原因,我无法在 python 中执行此操作。

我想要输入网址: /public/web/apidocs*** (其中 * 可以是任何东西 - 不包括任何东西) 传递给 python 应用程序 /apidocs*

这是我的配置:

server {
    listen      80;
    server_name localhost; ##ignored if there is only one server block
    charset     utf-8;
    client_max_body_size 75M;

    location = /frontend/webfrontendConnectionData {
        try_files $uri @yourapplication;
    }
    location /public/web/frontend {
        alias /frontend/;
        autoindex off;
    }
    location /public/web/adminfrontend {
        alias /adminfrontend/;
        autoindex off;
    }
    location ^(/public/web)(/apidocs.*)$ { 
        try_files $2 @yourapplication;
    }
    location / { 
        try_files $uri @yourapplication;
    }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/app/uwsgi.sock;
    }    
}

根据目前的回答进行更新:

感谢您指出错误或在配置中遗漏了 ~。 配置更改如下:

location ~ ^(/public/web)(/apidocs.*)$ { 
    try_files $2 @yourapplication;
}
location / { 
    try_files $uri @yourapplication;
}
location @yourapplication {
    include uwsgi_params;
    uwsgi_pass unix:/app/uwsgi.sock;
}    

不幸的是,它仍然无法按预期工作:

  • wget 127.0.0.1:80/apidocs -> 转到 python 应用程序并按预期工作
  • wget 127.0.0.1:80/apidocs/ -> 转到 python 应用程序并按预期工作
  • wget 127.0.0.1:80/apidocs/swagger.json -> 转到 python 应用程序并按预期工作
  • wget 127.0.0.1:80/public/web/apidocs -> 失败我希望它给出与 wget 127.0.0.1:80/apidocs 相同的响应
  • wget 127.0.0.1:80/public/web/apidocs/ -> FAILS 我希望它给出与 wget 127.0.0.1:80/apidocs/ 相同的响应
  • wget 127.0.0.1:80/public/web/apidocs/swagger.json -> 失败我希望它给出与 wget 127.0.0.1:80/apidocs/swagger.json 相同的响应

所有失败的回复都给我:

robert@ansiblerunner:~/t$ wget 127.0.0.1:80/public/web/apidocs/swagger.json
--2019-04-08 09:50:39--  http://127.0.0.1/public/web/apidocs/swagger.json
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 404 NOT FOUND
2019-04-08 09:50:39 ERROR 404: NOT FOUND.

谁能建议我想要的规则的正确语法。

更新 #2

在阅读了更多 nginx 文档后,我发现它没有按顺序使用位置规则并使用它命中的第一个规则,而是具有复杂的最长匹配算法。我担心“位置/”块会覆盖所有路径,所以我更改了配置,如下所示:

location /api/public { 
    try_files $uri @yourapplication;
}
location /api/authed { 
    try_files $uri @yourapplication;
}
location ~* ^(/public/web)(/apidocs.*)$ { 
    try_files $2 @yourapplication;
}
#location / { 
#    try_files $uri @yourapplication;
#}
location @yourapplication {
    include uwsgi_params;
    uwsgi_pass unix:/app/uwsgi.sock;
}    

/api/public 和 /api/authed 都正常工作。 是 /public/web/apidocs 没有。不同的是,在这种情况下,我需要 nginx 来更改提供给 python 应用程序的路径。这就是为什么我有一个包含两部分的正则表达式,它通过 $2 而不是 $uri。我认为它没有按照我的预期将 /apidoc 传递给应用程序。

【问题讨论】:

  • 前端和 adminfrond 行按预期工作,但 appidocs 重定向不是。我希望 /public/web/appidocs 使用 URL /appidocs 转发到 python 应用程序。这些重定向的末尾可能有其他字符串,也必须转发。当我尝试时,我只是没有找到。我认为正则表达式或 $2 有问题

标签: python-3.x nginx uwsgi


【解决方案1】:

我没有看到正则表达式,因为它没有波浪号。 您可能想要一个以:

开头的子句
location ~ ^(/public/web)(/apidocs.*)$ { 

你没有提到你正在阅读哪个docs。 咨询a tutorial, 了解 Nginx 服务器和位置块选择算法, 我们看到的语法是:

location optional_modifier location_match {

我们可以选择指定:

~:如果存在波浪号修饰符,则此位置将被解释为区分大小写的正则表达式匹配。

我无法解释您报告的 404 症状, 因为 location / 前缀子句应该已经吸收了 GET 请求 并且至少让@yourapplication 有机会记录原始 URL。

【讨论】:

  • 谢谢。我已经添加了〜,它仍然不起作用。 (我已经编辑了这个问题。)我认为 404 响应来自应用程序,因为如果我请求 /public/web/***,应用程序将给出 404。这就是为什么我需要先将 /public/web/apidocs 映射到 /apidocs,然后再将其传递给应用程序。
【解决方案2】:

我有答案 我对 try_files 没有按预期工作的理解完全偏离了基础。我发现一篇文章说如果我用下划线使用它,它不会尝试文件,只会使用它的后备。 我还发现我需要使用重写来更改路径。 可能不需要摆脱根位置,但无论如何我都不想拥有它。 我的最终配置如下:

server {
    listen      80;
    server_name localhost; ##ignored if there is only one server block
    charset     utf-8;
    client_max_body_size 75M;

    #location = /frontend/webfrontendConnectionData {
    #    try_files $uri @yourapplication;
    #}
    location /public/web/frontend {
        alias /frontend/;
        autoindex off;
    }
    location /public/web/adminfrontend {
        alias /adminfrontend/;
        autoindex off;
    }
    # try_files _ @xxx means don't look at any file go to xxx block
    location /api/public { 
        try_files _ @yourapplication;
    }
    location /api/authed { 
        try_files _ @yourapplication;
    }
    location /public/web/apidocs { 
        rewrite ^/public/web(/apidocs.*)$ /$1? break;
        try_files _ @yourapplication;
    }
    #location / { 
    #    try_files _ @yourapplication;
    #}
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/app/uwsgi.sock;
    }    
}

感谢 J_H 提供 cmets 和答案。

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2017-01-04
    • 2013-02-05
    • 2012-05-17
    • 2012-08-04
    • 1970-01-01
    • 2016-11-10
    • 2012-07-31
    相关资源
    最近更新 更多