Nginx改变路径

问题描述 投票:0回答:2

我一直在搜索nginx文档和在线发布,但我找不到答案。

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

我想输入url:/ public / web / apidocs ***(其中*可以是任何东西 - 包括什么都没有)作为/ apidocs *传递给python应用程序

这是我的配置:

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;
    }    
}

Update based on answer so far:

感谢您指出错误或错过配置中的〜。配置已更改如下:

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 - > FAILS我想让它给出与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 - > FAILS我想让它给出与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.

任何人都可以建议我想要的规则的正确语法。

Update #2

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

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传递给应用程序。

python-3.x nginx uwsgi
2个回答
1
投票

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

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

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

location optional_modifier location_match {

我们可以选择指定:

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

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


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的评论和答案。

© www.soinside.com 2019 - 2024. All rights reserved.