再談Nginx Rewrite, 中文URL和其它

上次談到過Nginx和中文URL的問題,這幾天又加深了認識。 多分享幾個關於Nginx Rewrite的經驗。

Nginx匹配指定中文URL的方法:

rewrite "(*UTF8)^x{66f4}x{6539}$" /index.html last;

這個會將 http://www.cslog.cn/%E6%9B%B4%E6%94%B9 重定向到http://www.cslog.cn/index.html。
‘/%E6%9B%B4%E6%94%B9′是中文URL ‘/更改’, x{66f4}x{6539}是這兩個漢字的Unicode編碼。

注意配合PCRE 7.9以上版本使用,詳細看Nginx和中文URL的問題

Nginx匹配URL中中文參數的方法:
如果要將 http://www.cslog.cn/index.php?title=%E6%9B%B4%E6%94%B9 重定向到http://www.cslog.cn, 則要使用

location = /index.php$ {
if ($args_title =%E6%9B%B4%E6%94%B9 ) {
rewrite ^ /;
}
}

在這裡, ‘?title=%E6%9B%B4%E6%94%B9′ 是不能用上例那裡的rewrite捕捉到的, 而要使用$arg_參數名這樣的方式處理。 而且在這裡, ‘%E6%9B%B4%E6%94%B9′是不用特別轉換的,直接放上去就可以了。

還要注意到 location後面的 ~, *~, ^~, =或空是有不同的效果的。詳細參看nginx的官方手冊

讓Nginx在同時識別到兩個參數的情況下重定向的方法
假設要在例如 http://www.cslog.cn/index.php?title=%E6%9B%B4%E6%94%B9&lang=Zh-tw 這樣的URL,只有在lang=Zh-tw參數存在,並且title參數也存在(不管它的值)的情況下才重定向, 要求會苛刻些,因為nginx自身沒有並列的邏輯處理能力,但可以使用如下的方法曲線解決:

location = /index.php {
set $redirect "";

# 檢查是否存在"title"參數:
if ( $arg_title ) {
set $redirect "Y";
}

# 檢查lang參數是否為 "Zh-tw":
if ( $arg_lang =Zh-tw ) {
set $redirect "${redirect}ES";
}

# 看看條件是否同時成立 "YES":
if ( $redirect = YES ) {
rewrite ^ / last;
}

....
}

轉載請註明: 轉自船長日誌, 本文鏈接地址: http://www.cslog.cn/Content/nginx-rewrite-chinese/zh-hant/

此條目發表在 信息處理, 站長文檔 分類目錄,貼了 , , , , , , , , , , , , , 標籤。將固定鏈接加入收藏夾。

再談Nginx Rewrite, 中文URL和其它》有 1 條評論

  1. 代碼之美 說:

    我之前用PHP正則匹配中文怎麼記得好像是4e00-9fa5 呵呵

發表評論