禁止直接访问 nginx 位置
disallow direct access to nginx location
我在 nginx 中有两个位置,其中一个重定向到另一个。我想做下一个:
第一个允许在浏览器中直接访问并将查询重定向到第二个位置。第二个位置转换到达 post,进行代理查询并仅允许从第一个位置开始。
第一个:
location /first/ {
rewrite ^ /second/ permanent;
}
第二个:
location /second/ {
proxy_method POST;
proxy_set_body '{ "arg1": "$arg_arg1", "arg2": "$arg_arg2" }
proxy_pass https://some_api.com/
}
如果第二个位置是从第一个位置重定向过来的(不是在浏览器中直接访问),如果是直接访问则显示一些 40x 错误,我该如何检查?
尝试使用 internal
指令,但这种重写不属于内部重定向的范畴。
重定向用于在用户浏览器中隐藏/first/ url
提前致谢
这与 nginx 无关,而是与 HTTP 协议和用户浏览器行为有关。无论您想做什么,我认为您都在尝试以错误的方式进行。通常,您需要在第一个位置生成一些 one-time 令牌并在第二个位置使用它,但这是一个网络应用程序工作,nginx 只是一个网络服务器而不是网络框架(但是它是可能的使用像 lua-nginx-module 这样的第三方模块)。如果您想使用 nginx 本身来完成它,无论您将完成什么样的解决方案,都可以跟踪和欺骗它。
这里有一个大致的想法:
location /first/ {
# set cookie with an access token
add_header Set-Cookie "my_token=my_super_password; path=/second/" always;
# do not use 301 redirect here or it will be cached by user browser, use 302 only!
rewrite ^ /second/ redirect;
}
location /second/ {
if ($cookie_my_token != "my_super_password") { return 403; }
# clear the token cookie on response
add_header Set-Cookie "my_token=deleted; path=/second/; expires=Thu, 01 Jan 1970 00:00:00 GMT" always;
... rest of configuration here
}
我在 nginx 中有两个位置,其中一个重定向到另一个。我想做下一个:
第一个允许在浏览器中直接访问并将查询重定向到第二个位置。第二个位置转换到达 post,进行代理查询并仅允许从第一个位置开始。
第一个:
location /first/ {
rewrite ^ /second/ permanent;
}
第二个:
location /second/ {
proxy_method POST;
proxy_set_body '{ "arg1": "$arg_arg1", "arg2": "$arg_arg2" }
proxy_pass https://some_api.com/
}
如果第二个位置是从第一个位置重定向过来的(不是在浏览器中直接访问),如果是直接访问则显示一些 40x 错误,我该如何检查?
尝试使用 internal
指令,但这种重写不属于内部重定向的范畴。
重定向用于在用户浏览器中隐藏/first/ url
提前致谢
这与 nginx 无关,而是与 HTTP 协议和用户浏览器行为有关。无论您想做什么,我认为您都在尝试以错误的方式进行。通常,您需要在第一个位置生成一些 one-time 令牌并在第二个位置使用它,但这是一个网络应用程序工作,nginx 只是一个网络服务器而不是网络框架(但是它是可能的使用像 lua-nginx-module 这样的第三方模块)。如果您想使用 nginx 本身来完成它,无论您将完成什么样的解决方案,都可以跟踪和欺骗它。
这里有一个大致的想法:
location /first/ {
# set cookie with an access token
add_header Set-Cookie "my_token=my_super_password; path=/second/" always;
# do not use 301 redirect here or it will be cached by user browser, use 302 only!
rewrite ^ /second/ redirect;
}
location /second/ {
if ($cookie_my_token != "my_super_password") { return 403; }
# clear the token cookie on response
add_header Set-Cookie "my_token=deleted; path=/second/; expires=Thu, 01 Jan 1970 00:00:00 GMT" always;
... rest of configuration here
}