<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>船長日誌 &#187; rewrite</title>
	<atom:link href="http://www.cslog.cn/tag/rewrite/feed/zh-hant/" rel="self" type="application/rss+xml" />
	<link>http://www.cslog.cn</link>
	<description>最讓我激動的是不知道下一個星球上能發現什麼...</description>
	<lastBuildDate>Wed, 30 Jul 2025 16:06:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>再談Nginx Rewrite， 中文URL和其它</title>
		<link>http://www.cslog.cn/Content/nginx-rewrite-chinese/zh-hant/</link>
		<comments>http://www.cslog.cn/Content/nginx-rewrite-chinese/zh-hant/#comments</comments>
		<pubDate>Fri, 29 Jun 2012 15:36:17 +0000</pubDate>
		<dc:creator>船長</dc:creator>
				<category><![CDATA[信息處理]]></category>
		<category><![CDATA[站長文檔]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[nginx中文url重寫]]></category>
		<category><![CDATA[nginx的utf8支持]]></category>
		<category><![CDATA[nginx重寫]]></category>
		<category><![CDATA[pcre]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[url重寫]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[中文url]]></category>
		<category><![CDATA[服務器]]></category>
		<category><![CDATA[漢字編碼]]></category>

		<guid isPermaLink="false">http://www.cslog.cn/?p=1058</guid>
		<description><![CDATA[上次談到過Nginx和中文URL的問題，這幾天又加深了認識。 多分享幾個關於Ng &#8230; <a href="http://www.cslog.cn/Content/nginx-rewrite-chinese/zh-hant/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>上次談到過<a href="http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/">Nginx和中文URL的問題</a>，這幾天又加深了認識。 多分享幾個關於Nginx Rewrite的經驗。</p>
<p>Nginx匹配指定中文URL的方法：<br />
<code><br />
rewrite "(*UTF8)^\x{66f4}\x{6539}$" /index.html last;<br />
</code><br />
這個會將 http://www.cslog.cn/%E6%9B%B4%E6%94%B9 重定向到http://www.cslog.cn/index.html。<br />
&#8216;/%E6%9B%B4%E6%94%B9&#8242;是中文URL ‘/更改’， \x{66f4}\x{6539}是這兩個漢字的Unicode編碼。</p>
<p>注意配合PCRE 7.9以上版本使用，詳細看<a href="http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/">Nginx和中文URL的問題</a>。<br />
<span id="more-1058"></span><br />
Nginx匹配URL中中文參數的方法：<br />
如果要將 http://www.cslog.cn/index.php?title=%E6%9B%B4%E6%94%B9 重定向到http://www.cslog.cn, 則要使用<br />
<code><br />
location = /index\.php$ {<br />
if ($args_title =%E6%9B%B4%E6%94%B9 ) {<br />
rewrite ^ /;<br />
}<br />
}<br />
</code><br />
在這裡， &#8216;?title=%E6%9B%B4%E6%94%B9&#8242; 是不能用上例那裡的rewrite捕捉到的， 而要使用$arg_參數名這樣的方式處理。 而且在這裡， &#8216;%E6%9B%B4%E6%94%B9&#8242;是不用特別轉換的，直接放上去就可以了。</p>
<p>還要注意到 location後面的 ~, *~, ^~, =或空是有不同的效果的。詳細參看<a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#location">nginx的官方手冊</a>。</p>
<p>讓Nginx在同時識別到兩個參數的情況下重定向的方法<br />
假設要在例如 http://www.cslog.cn/index.php?title=%E6%9B%B4%E6%94%B9&amp;lang=Zh-tw 這樣的URL，只有在lang=Zh-tw參數存在，並且title參數也存在（不管它的值）的情況下才重定向， 要求會苛刻些，因為nginx自身沒有並列的邏輯處理能力，但可以使用如下的方法曲線解決：<br />
<code><br />
location = /index\.php {<br />
set $redirect "";</code></p>
<p><code># 檢查是否存在"title"參數:<br />
if ( $arg_title ) {<br />
set $redirect "Y";<br />
}</p>
<p># 檢查lang參數是否為 "Zh-tw":<br />
if ( $arg_lang =Zh-tw ) {<br />
set $redirect "${redirect}ES";<br />
}</p>
<p># 看看條件是否同時成立 "YES":<br />
if ( $redirect = YES ) {<br />
rewrite ^ / last;<br />
}</p>
<p></code></p>
<p><code> ....<br />
}<br />
</code>
<div style="margin-top: 15px; font-style: italic">
<p>轉載請註明: 轉自<a href="http://www.cslog.cn/">船長日誌</a>, 本文鏈接地址: <a href="http://www.cslog.cn/Content/nginx-rewrite-chinese/zh-hant/">http://www.cslog.cn/Content/nginx-rewrite-chinese/zh-hant/</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.cslog.cn/Content/nginx-rewrite-chinese/feed/zh-hant/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nginx、PCRE和中文URL（UTF8編碼）rewrite路徑重寫匹配問題</title>
		<link>http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/zh-hant/</link>
		<comments>http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/zh-hant/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 15:08:45 +0000</pubDate>
		<dc:creator>船長</dc:creator>
				<category><![CDATA[信息處理]]></category>
		<category><![CDATA[站長文檔]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[nginx中文url重寫]]></category>
		<category><![CDATA[nginx的utf8支持]]></category>
		<category><![CDATA[pcre]]></category>
		<category><![CDATA[PCRE的UTF8編碼支持]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[url重寫]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[中文url]]></category>
		<category><![CDATA[服務器]]></category>
		<category><![CDATA[漢字編碼]]></category>

		<guid isPermaLink="false">http://www.cslog.cn/?p=793</guid>
		<description><![CDATA[最近遇到了使用Nginx 重寫中文UTF8編碼路徑的問題。 才發現默認情況下Ng &#8230; <a href="http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/zh-hant/">繼續閱讀 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近遇到了使用<a href="http://www.cslog.cn/tag/nginx/">Nginx</a> 重寫中文UTF8編碼路徑的問題。 才發現默認情況下Nginx的rewrite是不支持UTF8匹配的。 比如：</p>
<p><code>rewrite ^/(..)$ /2個字符文章.html break; #用2個點</code><br />
可以匹配到 /ab 或 /51, 但 /漢字 是匹配不到的。 我測試了一下， 要匹配兩個字的 /漢字 路徑， 得用</p>
<p><code>rewrite ^/(……)$ /2個漢字文章.html break; #要用六個點</code></p>
<p>如果要讓 ^/(..)$ 匹配到2個漢字字符，得開啟Nginx對UTF8字符的正則支持， 準確點說是開啟Nginx使用的PCRE庫的對UTF8字符的支持。因為Nginx的rewrite模塊是調用PCRE來處理正則的。 如果PCRE沒有問題，Nginx支持UTF8編碼的重寫樣式是：</p>
<p><code>rewrite "(*UTF8)^/(..)$" /2個字符文章.html break;<br />
#注意(*UTF8)前綴和引號的加入。</code></p>
<p><span id="more-793"></span>因為PCRE只有7.9以上的版本才支持這個(*UTF8)開頭，所以系統上的PCRE一定要使用7.9以上的版本。 另外，編譯PCRE時一定要開啟UTF8的支持。 即使用(&#8211;enable-utf8)參數。 檢查系統的PCRE版本和是否支持UTF8編碼可以使用<br />
<code>pcretest -C</code><br />
命令。執行後會顯示如下的報告：</p>
<blockquote><p>PCRE version 8.13 2011-08-16<br />
Compiled with<br />
UTF-8 support<br />
Unicode properties support<br />
Newline sequence is LF<br />
\R matches all Unicode newlines<br />
Internal link size = 2<br />
POSIX malloc threshold = 10<br />
Default match limit = 10000000<br />
Default recursion depth limit = 10000000<br />
Match recursion uses stack</p></blockquote>
<p>顯示“UTF-8 support”就是支持UTF8編碼了。</p>
<p>如果Nginx調用的PCRE為7.9以下的版本，使用 rewrite &#8220;(*UTF8)^/(..)$&#8221; /2個字符文章.html break; 這種形式的重寫，在執行nginx -t檢查時會出現如下的錯誤提示：</p>
<blockquote><p>[emerg]: pcre_compile() failed: (*VERB) not recognized in &#8220;(*UTF8)^、……</p></blockquote>
<p>如果Nginx調用的是7.9以上版本的PCRE，但是PCRE安裝時沒打開UTF8的支持開關，則會出現如下的錯誤提示：</p>
<blockquote><p>nginx: [emerg] pcre_compile() failed: this version of PCRE is not compiled with PCRE_UTF8 support in &#8220;(*UTF8)^/&#8230;</p></blockquote>
<p>解決辦法是安裝最新版本的的PCRE，並打開UTF8支持，方法如下（以當前8.13版的PCRE為例）：<br />
<code>wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.13.tar.gz<br />
tar zxvf pcre-8.13.tar.gz<br />
cd pcre-8.13<br />
./configure --enable-utf8 --enable-unicode-properties<br />
make<br />
make install</code></p>
<p>然後重新編譯安裝Nginx。 Nginx默認會打開rewrite模塊，並會自動查找系統上已經安裝了的PCRE。 如果Nginx查找不到已經安裝在系統上的PCRE， 或者系統上有多個PCRE， nginx調用了不支持UTF8的、或低版本的PCRE時（我遇到了後一種情況，並花費了很長的時間解決這個問題，這也是我為什麼寫這篇總結文章在這裡給大家分享的原因。。。），可以在編譯安裝Nginx時指定PCRE源文件。例如：</p>
<p><code>wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.13.tar.gz<br />
tar zxvf pcre-8.13.tar.gz<br />
wget http://nginx.org/download/nginx-1.0.8.tar.gz<br />
tar zxvf nginx-1.0.8.tar.gz<br />
cd nginx-1.0.8<br />
./configure \<br />
--with-pcre=../pcre-8.13</code></p>
<p>注意，如果接着直接make &amp;&amp; make install的話， PCRE因為沒有啟用UTF8， nginx將不能支持UTF8重寫， 所以在這一種，我動了一點小手腳：打開./objs/Makefile 文件，找到以下段落：</p>
<p><code> ../pcre-8.13/Makefile:	objs/Makefile<br />
cd ../pcre-8.13 \<br />
&amp;&amp; if [ -f Makefile ]; then $(MAKE) distclean; fi \<br />
&amp;&amp; CC="$(CC)" CFLAGS="-O2 -fomit-frame-pointer -pipe " \<br />
./configure --disable-shared </code><br />
在&#8211;disable-shared後加上 &#8211;enable-utf8和 &#8211;enable-unicode-properties參數， 即變成：<br />
<code> ../pcre-8.13/Makefile:	objs/Makefile<br />
cd ../pcre-8.13 \<br />
&amp;&amp; if [ -f Makefile ]; then $(MAKE) distclean; fi \<br />
&amp;&amp; CC="$(CC)" CFLAGS="-O2 -fomit-frame-pointer -pipe " \<br />
./configure --disable-shared --enable-utf8 --enable-unicode-properties</code><br />
然後再make, make install。 最後關閉nginx並重啟nginx（這裡不能用nginx -s reload)。這樣nginx就支持中文UTF8編碼的url重寫了。
<div style="margin-top: 15px; font-style: italic">
<p>轉載請註明: 轉自<a href="http://www.cslog.cn/">船長日誌</a>, 本文鏈接地址: <a href="http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/zh-hant/">http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/zh-hant/</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.cslog.cn/Content/nginx-pcre-utf8-rewrite/feed/zh-hant/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- WP Chinese Conversion Full Page Converted -->