如何使用 Nginx 創建臨時和永久重定向

介紹

HTTP 重定向是指將一個域名或地址指向另一個的方式。有幾種不同類型的重定向,每種對客戶端瀏覽器都有不同的意義。最常見的兩種類型是臨時重定向和永久重定向。

臨時重定向(回應狀態碼 302 Found)在 URL 暫時需要從不同位置提供服務時很有用。例如,如果您正在進行網站維護,您可能希望從您的域名重定向到一個解釋頁面,以通知您的訪問者您很快就會回來。

永久重定向(回應狀態碼 301 Moved Permanently),另一方面,通知瀏覽器應該完全忘記舊地址,不再嘗試訪問它。當您的內容已永久移動到新位置時,例如更改域名時,這些是很有用的。

本指南將更詳細地介紹如何在 Nginx 中實現每種重定向,並且通過一些特定用例的示例。

先決條件

要遵循本教程,您將需要:

  • A server with Nginx installed and set up to serve your website(s). You can find some examples and instructions on the tutorials for Ubuntu 22.04, Debian, or CentOS.

一览解决方案

在 Nginx 中,您可以使用内置的 rewrite 指令来完成大多数重定向。这个指令在全新的 Nginx 安装中默认可用,可用于创建临时重定向和永久重定向。在其最简单的形式中,它至少需要两个参数:旧的 URL 和新的 URL。

您可以通过在服务器配置中使用以下行来实现临时重定向:

Temporary redirect with rewrite
server {
    . . .
    server_name www.domain1.com;
    rewrite ^/$ http://www.domain2.com redirect;
    . . .
}

此重定向指示浏览器将所有对 www.domain1.com 的请求重定向到 www.domain2.com。然而,这个解决方案仅适用于单个页面,而不适用于整个站点。要重定向多个页面,您可以使用带有正则表达式rewrite 指令来指定整个目录,而不仅仅是单个文件。

redirect 匹配括号中的正则表达式模式。然后,它使用 $1 表达式在重定向目标中引用匹配的文本,其中 1 是匹配文本的第一个组。在更复杂的示例中,后续匹配的组会按顺序编号。

例如,如果您想要临时重定向 www.domain1.com 中的每个页面到 www.domain2.com,您可以使用以下内容:

Temporary redirect with rewrite
server {
    . . .
    server_name www.domain1.com;
    rewrite ^/(.*)$ http://www.domain2.com/$1 redirect;
    . . .
}

server {
    . . .
    server_name www.domain2.com;
    . . .
}

預設情況下,rewrite 指令會建立一個臨時重定向。如果您想創建一個永久重定向,您可以通過將指令的末尾的 redirect 替換為 permanent 來實現,就像這樣:

Permanent redirects
rewrite ^/$ http://www.domain2.com permanent;
rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;

讓我們繼續舉一些具體的例子。

示例1 — 移動到不同的域

如果您已經建立了網站存在並且想要將您的域更改為新的地址,最好不要僅僅放棄您的舊域。如果您的內容沒有任何有關如何找到其新位置的指示,您網站的書籤和其他網頁上的連結將會失效。沒有重定向的情況下更改域會導致您的網站失去來自以前訪問者和較老鏈接的流量。

在此示例中,我們將配置從名為 domain1.com 的舊域到名為 domain2.com 的新域的重定向。我們將在此處使用永久重定向,因為舊域將被棄用,所有流量應從現在起轉到新域。

假設您已將您的網站配置為從單個名為 domain1.com 的域提供服務,已在 Nginx 中配置如下:

/etc/nginx/sites-available/domain1.com
server {
    . . .
    server_name domain1.com;
    . . .
}

我們還假設您已經在 domain2.com 上提供了您未來版本的網站:

/etc/nginx/sites-available/domain2.com
server {
    . . .
    server_name domain2.com;
    . . .
}

讓我們修改 domain1.com 的伺服器塊配置文件,以新增一個永久重定向到 domain2.com

/etc/nginx/sites-available/domain1.com
server {
    . . .
    server_name domain1.com;
    rewrite ^/(.*)$ http://domain2.com/$1 permanent;
    . . .
}

我們使用了一個 rewrite 指令來添加上述的重定向。正則表達式 ^/(.*)$ 匹配了 URL 中 / 後的所有內容。例如,http://domain1.com/index.html 將被重定向到 http://domain2.com/index.html。為了實現永久重定向,我們只需在 rewrite 指令後添加 permanent

注意:請記得使用 nginx -t 測試您的配置,然後在進行更改後重新啟動 Nginx。

示例 2 — 創建持久體驗,儘管單個頁面名稱更改

有時,需要更改已經在您的網站上發佈並接收到流量的個別頁面的名稱。僅更改名稱將導致訪問原始 URL 的訪問者收到 404 Not Found 錯誤,但您可以通過使用重定向來避免這種情況。這確保了曾經將舊頁面加入書籤或通過搜索引擎上的過時鏈接找到它們的人仍然能夠訪問正確的頁面。

讓我們假設您的網站曾經有兩個分別為products.htmlservices.html的產品和服務頁面。現在,您決定將這兩個頁面替換為一個名為offers.html的單一優惠頁面。我們將為products.htmlservices.html配置一個簡單的重定向到offers.html

我們假設您的網站配置如下:

Original server block configuration
server {
    . . .
    server_name example.com www.example.com;
    . . .
}

配置重定向就像使用兩個重定向指令一樣簡單。

Redirects added to the original configuration
server {
    . . .
    server_name example.com www.example.com;
    
    rewrite ^/products.html$ /offer.html permanent;
    rewrite ^/services.html$ /offer.html permanent;
    . . .
}

rewrite指令接受要重定向的原始地址以及新頁面的目的地地址。由於這裡的更改不是暫時性的,我們在指令中也使用了permanent。您可以使用多個此類重定向,以確保當移動站點內容時,訪問者不會看到不必要的404找不到錯誤。

結論

您現在已經具備將請求重定向到新位置的知識。請確保使用正確的重定向類型,因為暫時性重定向的不當使用可能會損害您的搜索排名。

HTTP重定向還有多種其他用途,包括強制安全的SSL連接(即使用https而不是http)和確保所有訪問者只會最終進入網站的以www.為前綴的地址。

使用重定向功能正確地能夠讓您利用您現有的網路存在,同時也能夠根據需要修改您的網站結構。如果您想要更深入了解如何重定向您的訪問者,Nginx在官方文件的rewrite模組部分以及關於創建重定向的官方部落格文章中都有很好的文件。

Source:
https://www.digitalocean.com/community/tutorials/how-to-create-temporary-and-permanent-redirects-with-nginx