2013-08-01 49 views
3

我希望所有不是由我的IP地址生成的nginx請求都被重定向到/some-page。我目前使用這個nginx的配置:使用nginx重定向不是來自我IP的所有請求

if ($remote_addr != 127.0.0.1) { 
     rewrite^http://www.example.com/some-page; 
    } 

因爲我不是重定向,但任何人都卡在重定向循環,因爲該塊不檢查請求是/some-page這對我的作品。

我該如何解決這個問題?我不知道如何檢查請求路徑。

回答

2

如果在location /例如內創造了這個if,創建一個單獨的location /some-page這樣,當URI是/some-page


編輯if不會被執行:確定讓我解釋一下我的理解,你告訴我,如果我是對還是錯,

  1. 好IP(你的):服務頁面,因爲它是
  2. 錯誤的IP(不是你的):重定向到/some-page

的問題是,當錯誤的IP被重定向到/some-page它仍然重定向到/some-page再次,因爲它仍然是一個錯誤的IP,所以它通過if測試

我的解決辦法:從取出/some-page位置/塊:

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 
} 

當錯誤的IP轉發到/some-page它不再將執行if條件,以便將結束的無限redire ction循環。


第二個編輯:您可以設置在nginx的它自已的權限,讓我證明:

location/{ 
    error_page 403 = @badip 
    allow 127.0.0.1; 
    deny all; 
    #rest of bla bla 
} 
location @badip { 
    return 301 $scheme://example.com/some-page; 
} 
+0

我不認爲我理解你。我希望檢查影響'server'塊中的每個請求。添加一個「位置/一些頁面」不起作用。 – user1814016

+0

檢查我編輯的答案,試圖解釋我的意思 –

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; 
    }