Nginx

如果通過瀏覽器直接訪問圖像文件,如何重定向使用者?ng_我x_nG一世nXnginx

  • January 16, 2022

如果使用者嘗試僅在瀏覽器中直接訪問圖像文件,我該如何重定向?我想保留嵌入圖像的能力<img src="...">。如何從重定向

https://img.example.com/c/600x1200_90_webp/img-master/img/2022/01/03/08/04/54/95259215_p0_master1200.jpg

https://example.com/detail?id=95259215

這是我的 nginx 配置文件

location ~ "^/c/600x1200_90_webp/img-master/img/\d+/\d+/\d+/\d+/\d+/\d+/(?<filename>.+\.(jpg|png|webp))$" {
   return 301 https://example.com/detail?id=$filename;
}

程式碼不起作用,因為它會起作用,https://example.com/detail?id=95259215_p0_master1200.jpg但我需要它在文件名的最後一位數字之後修剪字元串,所以在這種情況下 trim off _p0_master1200.jpg。如果使用者通過瀏覽器訪問它,我也不知道如何製作它。

您的正則表達式(?<filename>.+\.(jpg|png|webp))$將整個文件名擷取到文件名變數。要僅提取_變數之前的部分,請改用以下內容:

(?<filename>[0-9]+).+(?:jpg|png|webp)$

這個只匹配filename變數的數字(我會稱之為image_id更具描述性)。https://regexr.com是處理正則表達式的好工具。

為了限制只顯示給瀏覽器,你需要使用nginx http referer 模組

這兩者結合起來,配置看起來像:

location ~ "^/c/600x1200_90_webp/img-master/img/\d+/\d+/\d+/\d+/\d+/\d+/(?<filename>[0-9]+).+(?:jpg|png|webp)$" {
   valid_referers server_names;
   if ($invalid_referer = "0") {
       return 301 https://example.com/detail?id=$filename;
   }
}

nginx 將檢查 HTTP Referer 值。如果它包含在server_name欄位中指定的名稱,它將發送重定向。referer 欄位由瀏覽器在載入網頁資源時設置。

引用自:https://serverfault.com/questions/1090142