【发布时间】: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