2013-04-23 113 views
6

我有一個簡單的配置文件,用於在維護時自定義503錯誤頁面。相關部分是這樣的:Nginx的POST請求返回503

server { 
    listen  80 default; 
    root  /usr/share/nginx/html; 
    server_name example.com; 

    location/{ 
     if (-f $document_root/503.json) { 
      return 503; 
     } 
    } 

    # error 503 redirect to 503.json 
    error_page 503 @maintenance; 
    location @maintenance { 
     rewrite ^(.*)$ /503.json break; 
    } 
} 

問題是Nginx的計算出的任何請求一個靜態文件和任何POST解決,PUT和DELETE請求得到405(不允許的方法)的響應。

所以問題是:如何告訴Nginx爲任何HTTP方法提供服務?

+1

你有沒有想出一個解決方案呢? – 2014-03-25 10:53:50

回答

3

我就遇到了這個今天。看來這個問題是由於nginx(像大多數服務器)不讓你POST到一個靜態文件。

解決方案是在您的@ 503位置塊中捕獲405個錯誤,爲維護頁面提供 服務。此外,您必須啓用 @ recursiveerrorpages @,因爲你是第一個,故意扔 503錯誤,然後該用戶被張貼到你的 靜態文件扔了405:

recursive_error_pages on; 

if (-f $document_root/system/maintenance.html) { 
    return 503; 
} 

error_page 404 /404.html; 
error_page 500 502 504 /500.html; 
error_page 503 @503; 
location @503 { 

    error_page 405 = /system/maintenance.html; 

    # Serve static assets if found. 
    if (-f $request_filename) { 
    break; 
    } 

    rewrite ^(.*)$ /system/maintenance.html break; 
} 

來源:https://www.onehub.com/blog/2009/03/06/rails-maintenance-pages-done-right/

+0

在這種情況下,返回到帖子請求的狀態碼在這種情況下仍然是405,但是,是正確的嗎? – 2017-06-01 02:16:32

+0

@MohamedHafez nope,它應該返回一個503.它在鏈接的源文章中有詳細解釋,但是從內存中它被重定向到維護頁面,然後明確地拋出一個503 – Jay 2017-06-02 02:12:29

0

也許嘗試迫使405個請求是實際的URI:

​​
+0

不確定你的意思。實際的URI結果爲405.我想要503. – cababunga 2013-04-24 00:31:06

+0

看到它是否有效 error_page 405 = 503/50x.html; – 2014-12-29 21:06:36