Nginx更改路径

时间:2019-04-07 14:44:59

标签: python-3.x nginx uwsgi

我一直在搜索thoruhg 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 App并按预期工作
  • wget 127.0.0.1:80/apidocs/->转到python App并按预期工作
  • wget 127.0.0.1:80/apidocs/swagger.json->转到python App并按预期工作
  • 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/->失败我希望它给出与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传递给应用程序。

2 个答案:

答案 0 :(得分:1)

我在那里没有看到正则表达式,因为它没有波浪号。 您可能想要一个以以下内容开头的子句:

location ~ ^(/public/web)(/apidocs.*)$ { 

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

location optional_modifier location_match {

,我们可以选择指定:

  

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

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

答案 1 :(得分:0)

我有一个答案 我对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的评论和回答。