全域性改寫規則

應用之間會有很多相同的頁面規則,除了使用 全域性自定義動作 外,我們還可以使用 全域性改寫規則 來實現。

全域性改寫規則和全域性自定義動作不同,後者需要在應用中新增,並且走釋出流程才會生效。 而前者對於應用是無感知的,也不用走釋出流程。也就是增加了一個改寫規則,就直接對所有的應用生效了。 所以使用全域性改寫規則的時候,需要格外小心一些。

下面我們先新建一個沒有任何改寫規則的應用:

然後我們不加改寫規則,直接訪問:

$ curl -i -H 'host: rewrite-rule-test.com' 52.43.45.19/404.html
HTTP/1.1 404 Not Found
Server: openresty+
Date: Mon, 21 Jan 2019 15:59:57 GMT
Content-Type: text/html
Content-Length: 166
Connection: keep-alive

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>openresty</center>
</body>
</html>

會返回 404 的錯誤資訊,這是預料之內的。 然後我們去 全域性設定 中的 全域性改寫規則 頁面,新增一個規則。

在全域性改寫規則頁面中,會列出已經存在的全域性規則。 我們點選 新規則 按鈕,來新建一個。

這個頁面和應用的 頁面規則 類似,都包含開啟條件和動作兩個部分。

下面是一個簡單的例子,無條件的返回一個字串。

改寫規則的下拉選單裡面有很多動作,我們從中選擇“響應動作”類別中的 輸出響應體

點選後下角的 建立 按鈕,一個全域性改寫規則就設定成功了。

這時候這個全域性改寫規則,不用走釋出流程,它已經對上面新增的應用生效了。 我們訪問看看返回值:

$ curl -i -H 'host: rewrite-rule-test.com' 52.43.45.19/404.html
HTTP/1.1 200 OK
Date: Tue, 14 Nov 2023 10:51:34 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Server: OpenResty Edge
Req-ID: 00002a000e80584eb9b0b942

<!doctype html>
<html>
<head>
  <title>Response</title>
</head>
<body>
</body>
</html>

這次沒有返回 404 的錯誤資訊,而是全域性改寫規則設定的相應體。

我們再把這個全域性改寫規則刪掉,試試看。

再次訪問,又返回了 404:

$ curl -i -H 'host: rewrite-rule-test.com' 52.43.45.19/404.html
HTTP/1.1 404 Not Found
Server: openresty+
Date: Mon, 21 Jan 2019 16:00:11 GMT
Content-Type: text/html
Content-Length: 166
Connection: keep-alive

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>openresty</center>
</body>
</html>