我的 aws 服务器中托管了一个 rails 应用程序,并使用 nginx 作为代理服务器。在同一实例中,我在端口 3004 上运行 api 服务器。在 nignx conf 文件中,我做了一些更改,以便可以通过 domain.com/api 访问 api 服务器的内容,而我的 rails 应用程序可以通过 domain.com 访问。
当我访问 domain.com/api 时,我将获得可以访问的端点列表。但问题是我必须访问这些端点,例如 domain/apicategories。这是不正确的。我必须像 domain/api/categories 一样访问它们。以下是我的 nignx conf 文件
upstream postgrest {
server localhost:3004;
keepalive 64;
}
server {
listen 80;
server_name localhost;
root /home/deploy/test/current/public;
try_files $uri/index.html $uri @app;
location /api {
default_type application/json;
proxy_hide_header Content-Location;
add_header Content-Location /api$upstream_http_content_location;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://postgrest/;
}
答案1
/
当 Tim 帮你评论时,你漏掉了一个斜杠地点堵塞。
摘录自NGINX 官方文档:
如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由以下之一处理代理密码, fastcgi_pass,uwsgi_pass,scgi_pass, 或者memcached_pass,则执行特殊处理。响应 URI 等于此字符串但不带尾部斜杠的请求,将返回带有代码 301 的永久重定向到附加了斜杠的请求 URI。如果不希望这样,可以像这样定义 URI 和位置的精确匹配:
因此,在这种情况下,这两者并不相等:
location /api/ {
...
}
IS NOT EQUAL WITH
location /api {
...
}
但如果你想在需要匹配的情况下避免此类错误你的域名/api或者你的域名/api/作为完整字符串,您可以使用以下正则表达式匹配:
location ~ ^/api/?$ {
...
}
波浪~
符号将启用正则表达式匹配,并/?
允许/
在输入结束前出现一个或零个斜线符号。