Nginx
如果通過瀏覽器直接訪問圖像文件,如何重定向使用者?ng_我x_nG一世nXnginx
如果使用者嘗試僅在瀏覽器中直接訪問圖像文件,我該如何重定向?我想保留嵌入圖像的能力
<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 欄位由瀏覽器在載入網頁資源時設置。