各位前輩大家好
最近我在把php網站的網址做urL rewrite
但在包含中文的時候遇到一些問題
希望可以幫我解惑
原本:index.php?cat1=首頁
要變成:首頁
這樣寫的話會抓不到(英數沒問題)
RewriteRule ^(\w*)$ index.php?cat1=$1
這樣也是(英數也不行)
RewriteRule ^(.*)$ index.php?cat1=$1
這樣寫的話則可以,所以想說應該不是編碼的問題(?)
RewriteRule ^([首頁]*)$ index.php?cat1=$1
想請問要如何達成可以接收任意中文字的功能?
謝謝~
你應該每次 $_GET['cat1'] 都抓到 index.php 吧?
rewrite 的行為, 是改寫後會再比對一次
所以 xxx.com/中文 被改寫成 xxx.com/index.php?cat1=中文
然後 xxx.com/index.php?cat1=中文 又被改寫成 xxx.com/index.php?cat1=index.php
最後 rewrite 發現改寫前後都是 index.php 就停了
你可以試試看這樣弄, 要 apache 2.3.9 以後才支援, 但現在應該都用 2.4 了:
<pre class="c" name="code">RewriteRule ^(.*)$ index.php?cat1=$1 [END]
如果 END 不能用, 那你就只好先加上 RewriteCond 排除掉有 index.php 的情況
<pre class="c" name="code">
RewriteCond "%{REQUEST_URI}" !^/index.php
RewriteRule ^(.*)$ index.php?cat1=$1
用了以後
500Internal Server Error
RewriteCond "%{REQUEST_URI}" !^/index.php
這樣以後不會500了
但依然抓不到資料
你是寫在 .htaccess 裡面嗎?
沒抓到資料, 那 echo $_GET['cat1'] 顯示什麼?
好像不是這方便的問題
因為英數就可以
方便X
方面O
一直打錯字.....
你把你現在的設定完整的貼上來吧
.htaccess的部分
<pre class="c" name="code">
RewriteEngine On
RewriteRule ^css($|/) - [L,NC]
RewriteCond "%{REQUEST_URI}" !^/index.php
RewriteRule ^(.*)$ index.php?cat1=$1
打中英數
echo出來都是index.php
如果把(.*)換成(\w*)
英數正常
中文會502 Bad Gateway
RewriteRule ^(\w*)$
你有把你這行改成跟我的一樣嗎?
\w 相當於 [a-zA-Z0-9], 沒辦法拿來比對中文喔
<pre class="c" name="code">RewriteRule ^(.*)$ index.php?cat1=$1
打中英數
echo出來都是index.php
那現在問題就是為什麼 RewriteCond 似乎沒起作用了
改成這樣呢?
<pre class="c" name="code">
RewriteEngine On
RewriteRule ^css($|/) - [L,NC]
RewriteCond "%{REQUEST_URI}" !index.php
RewriteRule ^(.*)$ index.php?cat1=$1
再不行的話, 換個思考方式, 不存在的檔案才 rewrite
<pre class="c" name="code">
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?cat1=$1
可以了!!
謝謝你半夜還幫我回答問題
學到一課了
現在回去看,發現自己幹了不少蠢事.....
這篇可以參考一下,希望有幫助到您~!