我希望所有未通过我的IP地址发出的nginx请求被重定向到/some-page
。我目前正在使用这个nginx配置:
if ($remote_addr != 127.0.0.1) {
rewrite ^ http://www.example.com/some-page;
}
这对我有用,因为我没有被重定向,但是其他任何人都陷入了重定向循环,因为该块不会检查请求是否适用于/some-page
。
我该如何解决这个问题?我不确定如何检查请求路径。
答案 0 :(得分:3)
如果在if
内创建此location /
,请以这种方式创建单独的location /some-page
,当URI为{{1时,if
将不会执行}}
/some-page
问题是,当错误的IP重定向到/some-page
时,它仍会重定向到/some-page
,因为它仍然是错误的IP,因此它会通过/some-page
测试
我的解决方案:从if
区块移除/some-page
位置:
/
当Bad IP转发到location / {
# bla bla
if ($remote_addr != 127.0.0.1) {
rewrite ^ http://www.example.com/some-page;
}
# rest of bla bla
}
location /some-page {
try_files index.html index.php; # or whatever
}
时,它不再执行/some-page
条件,因此将结束无限重定向循环。
if
答案 1 :(得分:1)
我最后通过对请求路径进行另一次if
检查来解决问题。我知道nginx不支持嵌套的if
语句,因此我搜索并找到this blog post,它提供了一种解决方法 - 使用要检查的每个语句更新变量,然后在最终语句中对其进行匹配。在我的情况下,我做了这个,有效:
if ($remote_addr != 127.0.0.1) {
set $check O;
}
if ($request_uri != "/some-page") {
set $check "${check}K";
}
if ($check = OK) {
rewrite ^ http://www.example.com/some-page;
}