iT邦幫忙

0

PHP REWRITE

php
chan15 2010-09-02 16:10:1910338 瀏覽

當初案子是用id帶的,譬如說 http://www.xxx.com/blog_index.php?mid=1
整個網站架構已經是這樣了,客戶現在想用username帶還有機會嗎
http://www.xxx.com/blog/username = http://www.xxx.com/blog_index.php?mid=1

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
6
logoooit
iT邦新手 4 級 ‧ 2010-09-05 05:07:56
最佳解答

首先,確定你客戶 Apache 的環境,有支援 Rewrite 模組 與 Access File (俗稱的 .htaccess 檔)

二,新增一個名為 .htaccess 檔案

並在它內容的空白處輸入

RewriteEngine On

啟用 Rewrite 模組

然後下一行,再 Key 上

RewriteRule ^blog/([^/]+)/*$ 你客戶的部落格程式.php?給程式讀的參數名稱=$1

輸入完後,存檔,放到跟你客戶程式放在一起的目錄下

即可利用 http://你客戶的網址/blog/會員名稱 這樣子的假 URL,連到真實的了

當然,這還需要你修改客戶的程式,讓它跟 Rewrite 的設定互相配合,才能完美的運作,達到客戶的要求

看更多先前的回應...收起先前的回應...
chan15 iT邦新手 2 級 ‧ 2010-09-06 15:56:22 檢舉

我的確是這樣做,但是一直就是吃不到後面的會員名稱變數

chan15 iT邦新手 2 級 ‧ 2010-09-06 16:01:51 檢舉

而且我這樣下
RewriteRule ^blog/([^/]+)/*$ http://www.google.com
然後打http://localhost/test/blog/1
也沒有轉到Google,所以我想根本上的問題是前面那段

chan15 iT邦新手 2 級 ‧ 2010-09-06 16:19:34 檢舉

講一下我的環境配置
我自己的測試server是
http://localhost/test/
建立了一個blog.php裡面echo $_GET['username'];

.htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/test/$
RewriteRule ^blog/(.*)$ blog.php?username=$1

http://localhost/test/blog.php?username=david echo出David
http://localhost/test/blog/david 有到blog頁面但echo出空白

chan15 iT邦新手 2 級 ‧ 2010-09-06 17:10:46 檢舉

請教一下有沒有最簡單的語法測試rewreite到底有沒有作用?

logoooit iT邦新手 4 級 ‧ 2010-09-06 18:34:04 檢舉

語法有作用,沒問題,這是機器的配置問題

logoooit iT邦新手 4 級 ‧ 2010-09-06 18:34:36 檢舉

晚點再幫你看~

chan15 iT邦新手 2 級 ‧ 2010-09-06 20:18:00 檢舉

感謝你啊,弄這個弄的好痛苦 QQ

chan15 iT邦新手 2 級 ‧ 2010-09-06 20:21:11 檢舉

如果有需要的話,我可以Email我的http.conf給您 QQ

chan15 iT邦新手 2 級 ‧ 2010-09-06 20:38:51 檢舉

RewriteRule http://localhost/test/blog/([^/]+)/*$ http://www.google.com
整個下絕對路徑都沒用

chan15 iT邦新手 2 級 ‧ 2010-09-07 11:17:09 檢舉

RewriteRule .* http://www.gooogle.com 這樣有順利轉到Google
RewriteRule .* blog.php?u=$1 這樣也有順利轉到blog.php

blog.php
echo $_GET['u']; 卻是空的
為什麼抓不到值?

chan15 iT邦新手 2 級 ‧ 2010-09-07 11:39:20 檢舉

RewriteRule ^blog.php/(.*)$ blog.php?u=$1 [L]
前面正規式加入.php就work了… 終於,雖然不知道原因為何

chan15 iT邦新手 2 級 ‧ 2010-09-07 11:58:53 檢舉

RewriteRule ^blog.php/(.*)$ transfer.php?func=blog&u=$1 [L]
RewriteRule ^album.php/(.*)$ transfer.php?func=album&u=$1 [L]

這樣寫的話,根目錄一定要有一隻album.php才能work,不然會失連,希望有人可以告訴我最對得破解方式 QQ

8
fillano
iT邦超人 1 級 ‧ 2010-09-02 17:31:23

這樣其實key就改變了,不改程式,光靠rewrite做不出來的啦。至少你要下sql statement的時候,where條件就不會一樣阿。

你至少要把程式調整到可以用username做GET參數。

看更多先前的回應...收起先前的回應...
chan15 iT邦新手 2 級 ‧ 2010-09-02 18:01:06 檢舉

sql條件一定要改得,但起碼要先確定現在用rewrite搞不搞得定,然後怎麼弄這樣

chan15 iT邦新手 2 級 ‧ 2010-09-02 18:03:16 檢舉

然後客戶沒這麼硬,只要每個單元的portal可以用帳號進入即可,裡面還是可以用id

chan15 iT邦新手 2 級 ‧ 2010-09-02 18:04:12 檢舉

所以很有可能要想辦法兩個都並存,但只針對譬如說相簿的portal跟blog的portal之類的

fillano iT邦超人 1 級 ‧ 2010-09-03 01:07:32 檢舉

建議你分目錄擺,這樣可以把rewrite分開處理,比較簡單。例如blog就放在blog目錄,相簿就放在photo目錄等,然後分別針對這兩個目錄設定rewrite rule。

假設你把程式移到blog目錄,blog_index.php改成index.php,這樣可以設定規則像:

<pre class="c" name="code">
RewriteEngine on
RewriteBase /blog/
RewriteRule ^(.*)$ index.php?arg=$1 [NE]

例如我固定用這樣的pattern傳入:

<pre class="c" name="code">
http://www.xxx.com/blog/username/postid

實際傳給你程式的是:

<pre class="c" name="code">
http://www.xxx.com/blog/index.php?arg=/username/postid

然後你在程式中做調整,把$_GET['arg']剖析成你要的變數,你再根據這些來決定要顯示什麼東西。

fillano iT邦超人 1 級 ‧ 2010-09-03 01:20:39 檢舉

阿,果然沒試一下不行...

<pre class="c" name="code">
RewriteEngine on
RewriteBase /blog/
RewriteRule ^(.*)$ index.php?arg=$1 [QSA]

這樣你用 http://www.xxx.com/blog/username/postid 這樣的網址pattern,在 index.php 裡面用 $_GET['arg'] 會得到 "username/postid" 。

fillano iT邦超人 1 級 ‧ 2010-09-03 09:46:49 檢舉

在配合rewrite時,通常還會處理URL不合pattern的狀況,送出404狀態。文章或是user找不到的話,就看你要怎麼處理,建議還是送出404,這樣處理會比較統一,也更符合search engine friendly的要求。

chan15 iT邦新手 2 級 ‧ 2010-09-03 14:04:30 檢舉

case已經上線了,現在要依照資料夾分有點難度
請教fillano大哥
我現在在自己server先做測試
.htaccess
RewriteEngine On
RewriteRule ^blog/([0-9]+)$ blog.php?id=$1
然後建立blog.php裡面echo $_GET['id']
http://localhost/test/blog.php?id=1 這樣有echo出1
http://localhost/test/blog/1 這樣抓不到值也沒有任何錯誤
是哪邊設定出了問題呢?

fillano iT邦超人 1 級 ‧ 2010-09-03 18:31:29 檢舉

這樣...

你改成
RewriteRule /blog/(.*) /blog.php?id=$1 試試看。

6
googee
iT邦新手 5 級 ‧ 2010-09-03 14:21:13

你可以自己去寫一個 function, 把 username 丟進去會吐 ID 回來的 function.
帶進去的 username 就用這個 function 去解成 ID, 然後再 pass 給你原本寫的程式跑, 所有的架構照舊,只是在開頭的地方先解讀看 pass 進來的是 id 還是 username 就可以了。

反過來說,也可以寫一個丟 id 進去吐 username 出來的 function..
應該不困難。

看更多先前的回應...收起先前的回應...
chan15 iT邦新手 2 級 ‧ 2010-09-03 14:23:13 檢舉

寫function那些不是問題,卡在rewrite…

chan15 iT邦新手 2 級 ‧ 2010-09-03 15:27:17 檢舉

看文章說要在.htaccess加入
AllowOverride All
可是我一加入就會出現錯誤訊息,那表示.htaccess應該有被吃到吧

James iT邦大師 6 級 ‧ 2010-09-03 15:35:52 檢舉

有些系統預設沒有啟動rewrite module
例如DEBIAN系列的APACHE2就要先做一個符號鏈結
#ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

fillano iT邦超人 1 級 ‧ 2010-09-06 08:42:18 檢舉

看文章說要在.htaccess加入
AllowOverride All

不對吧...AllowOverride All是放在針對目錄的設定中,允許.htaccess來蓋過設定,所以會在

<pre class="c" name="code">
<Directory /path/to/directory>
AllowOverride All
</Directory>

或是VirtualServer

<pre class="c" name="code">
<VirtualServer *:80>
  <Directory />
    AllowOverride All
  </Directory>
</VirtualServer>

等地方出現,但是不應該出現在.htaccess中吧?
請參考:http://httpd.apache.org/docs/current/mod/core.html#allowoverride

我要發表回答

立即登入回答