我一直在搜索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;
}
不幸的是,它仍然无法按预期工作:
所有失败的答复都给我:
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.
任何人都可以为我想要的规则建议正确的语法。
阅读更多的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传递给应用程序。
答案 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的评论和回答。