Nginx

在位置完成處理重寫指令並返回 301

  • December 14, 2017

我的 nginx.conf 中有以下內容:

location ~* /collections.*?products/([^/]+)/?$ {
   rewrite ^/collections.*?products/([^/]+)/?$ /$1.html;
   rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3;
   rewrite ^([^_]*)_(.*)$ $1-$2 permanent; 
}  

重寫請求,例如

"/collections/products/someproduct/" to "/someproduct.html"
"/collections/products/some_product/" to "/some-product.html"
"/collections/products/some_other_product/" to "/some-other-product.html"

permanent但是,如果最後一個重寫指令(包含標誌)匹配並處理,例如我的第二個範例,我只能獲得 301 重定向。在其他 2 個實例中,我得到一個 302 臨時重定向。如何在此位置塊中處理這些多個重寫指令並返回 301 重定向,而不管哪些匹配?如果我在所有重寫指令上放置一個永久標誌,它將在第一次匹配後停止處理。

您可以遞歸地轉換_為獨立於.-``rewrite...permanent

例如:

location ~* /collections.*?products/([^/]+)/?$ {
   rewrite ^(.*)_(.*)$ $1-$2 last;
   rewrite ^/collections.*?products/([^/]+)/?$ /$1.html permanent; 
}

rewrite只有在第一個rewrite找不到更多下劃線後才執行第二個。有關更多資訊,請參閱此文件

您可以將302狀態碼視為“異常”,並通過http://nginx.org/r/error_page將其“擷取” 。

location ~* /collections.*?products/([^/]+)/?$ {
   rewrite ^/collections.*?products/([^/]+)/?$ /$1.html;
   rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3;
   rewrite ^([^_]*)_(.*)$ $1-$2 permanent;
   error_page 302 =301 @302to301;
}
location @302to301 {
   return 300; # 300 is just a filler here, error_page dictates status code
   #return 301 $sent_http_location;
}

該技術類似於我的301-302-redirect-w-no-http-body-text.nginx.conf,根據有關在沒有 HTTP Response Body 的情況下生成 301/302 重定向的相關問題

請注意,在 內@302to301,您可以在上面的兩個返回語句之間進行選擇;但是,return程式碼與此處理程序的上下文無關,因為error_page上面的指令確保所有302程式碼都更改為301無論後續程式碼是什麼。

換句話說,return上面兩個語句之間的唯一區別是 HTTP 響應正文的內容,無論如何瀏覽器都不會顯示 301 響應,因此,您不妨選擇較短的無正文return 300版本。

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