我一直在搜索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;
}
}
感谢您指出错误或错过配置中的〜。配置已更改如下:
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 /”块然后覆盖所有路径,所以我改变了配置,所以它如下所示:
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传递给应用程序。
我没有看到正则表达式,因为它没有波浪形。您可能想要一个以以下内容开头的子句:
location ~ ^(/public/web)(/apidocs.*)$ {
你没有提到你正在阅读的docs。咨询a tutorial,了解Nginx服务器和位置块选择算法,我们看到语法是:
location optional_modifier location_match {
我们可以选择指定:
〜:如果存在波形符修饰符,则此位置将被解释为区分大小写的正则表达式匹配。
我无法解释您报告的404症状,因为location /
前缀子句应该已经吸收了GET请求,并且至少为@yourapplication提供了记录原始URL的机会。
我有一个答案,我完全偏离了我对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的评论和答案。