我正在尝试设置我的 SPA,通过让 nginx 在响应之前对资源进行回溯检查,以返回 404 来表示无效资源。所有这些都是为了避免无效页面出现 200,从而避免蜘蛛抓取软 404 页面。
我希望的行为
Browser Nginx API
| -- GET myapp.com/users/12 --> | |
| | -- GET myapi:8000/users/12 |
| | <----------- 404 -------- |
| <-- 404 index.html ------------ |
| |
我希望我的配置如下所示
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location /users/ {
# 1. Fetch from myapi:8000
# 2. Return index.html with status from fetched URI
}
}
我已经研究了一段时间,但还是不太清楚如何实现这一点。我见过很多简单的例子,但try_files
似乎没有一个适合我的情况,因为大多数例子似乎都做了非常简单的转发。
我怎样才能实现上述行为?
答案1
我设法通过让我的后端 API 始终使用 index.html 进行响应来解决这个问题Accept: text/html
。我确实尝试过使用 OpenResty 的 Lua 方式,但感觉太过黑客和古怪,并且维护起来太复杂。
然后我的配置如下所示:
location / {
try_files $uri $uri/ @forward_to_api;
}
location @forward_to_api {
rewrite ^(.*) /api$1 break;
proxy_set_header "Accept" "text/html";
proxy_pass http://localhost:8000;
# Follow any redirects
proxy_intercept_errors on;
error_page 301 302 307 = @follow_redirect;
}
location @follow_redirect {
set $moved_location $upstream_http_location;
proxy_pass http://localhost:8000$moved_location;
}
这会将所有 $uri 重定向到localhost:8000/api/$uri
并遵循重定向。