你的問題不是說的很清楚。
我假設你是有個站台 http://short/
然後想要用 http://short/某個短字串 (比如 http://short/abc123)
這樣的方式來轉址到另一個比較長或者完整的網址
那麼 PHP 當然可以做到,只要先在 apache 加一條指令:
AliasMatch ^/\w+$ /var/www/html/redirect.php
然後寫一支 PHP redirect.php 來接收這個轉向。內容如下:
<pre class="c" name="code"><?php
// 第一種簡單轉址 (用 if 或 switch 判斷):
if ($_SERVER['SCRIPT_NAME'] == '/abc123')
header('Location: ' . 真正要前往的網址);
elseif ($_SERVER['SCRIPT_NAME'] == '/def456')
header('Location: ' . 真正要前往的網址);
// ....... 有多少列多少
// 第二種 HASH 轉址 (以 hash array 對應):
// 先建立一個 KEY -> VALUE 對應的陣列,也就是簡碼 -> 真正網址
// 可以存在資料庫,此程式執行時取出成 hash 陣列 (假設是 $trans )
// 然後如下轉址
if (isset($trans[$_SERVER['SCRIPT_NAME']]))
header('Location: ' . $trans[$_SERVER['SCRIPT_NAME']]);
?>
大部份的 Rewrite 都可以用 Alias 做到,能不用就不用。
感謝wiseguy大大分享。
sorry!針對問題不清楚再多補充說明:
例如通常網址為http://www.example.tw/index.php?name=1&d=w&n=1
現在希望網址導向成 http://www.example.tw/index.php/pro/ 一樣可以到達目標,就是不要後面的?name=1&d=w&n=1等..
另外,不要修改apache設定檔(httpd.conf)的情況下,都以php程式實作出來。不知道可不可以。Thank You
當然可以啊。
如果你就是要用 index.php 來轉,那麼連那個 AliasMatch 都可以省了。
AliasMatch 的目的只是讓你可以連 index.php 都省掉不必寫。
所以就直接就在 index.php 程式中寫:
<pre class="c" name="code">
if ($_SERVER['PATH_INFO'] == '/pro/')
{
$name = '1';
$d = 'w';
$n = '1';
}
// 接著就繼續原本 /index.php?name=1&d=w&n=1 該做的事
其它字串的對應就依此類推囉。
補充說明,
因為我不知道你想要的效果。
假設原網址 http://www.example.tw/index.php?name=1&d=w&n=1 是 A
短網址 http://www.example.tw/index.php/pro/ 是 B
那麼你要的效果是 user 連到 B 的時候就要執行 A 的功能?還是user 連到 B 的時候,讓他轉到 A 去執行功能?我 2 樓的寫法是第一種效果,假如你想要第二種效果,那麼就改成:
<pre class="c" name="code">
if ($_SERVER['PATH_INFO'] == '/pro/')
{
header ('Location: /index.php?name=1&d=w&n=1');
}
即可。
有試過第二個方法。
原網址 http://www.example.tw/index.php?name=1&d=w&n=1 是 A
短網址 http://www.example.tw/index.php/pro/ 是 B
可是B->A時,瀏覽器上的網址列就會改變。
因為需要效果內容,B短網址列連結到A原網址,還是保持在B網址的狀態。
你用header的方式轉換位置,當然不會保持在B網站
http://example.tw/?pro 這樣難道不好嗎?
如果機器上不能使用 Rewrite 模組
你可以在網站根目錄 或 開次網域在裡面下放一個 index.php 或 一些可以作為首頁的檔案
然後透過 $_GET 這個變數取得參數,用 array_keys 抽出 key 值作為 id
<pre class="c" name="code"><?
$id = '';
if ( 1 == count($_GET) ) {
$id = array_keys($_GET);
$id = $id[0]; // 安全上的問題記得要處理,這視同使用者輸入
}
echo $id;
?>
至於連結長什麼樣子
大概像是 http://hellourl.com/?xPPo
xPPo 即為參數,只要判斷參數,就可以做後續的處理
找一個範例網站
http://www.puda.com.tw/hotels/page-1/
http://www.puda.com.tw/residence/page-1/
其網址後面都沒有php?name=1&arg=....等參數傳遞,這就是目前所期望效果。
這就是為什麼我一開始就要你使用 AliasMatch 做轉向的原因。
因為要把所有亂七八糟的 URL 通通轉到一支 PHP 做處理。
如果你不做這一動,那就算用我後來補充的第一種方式,即使可以做到 /index.php/xxx,也不漂亮,還是會有 index.php 這樣的字秀出來。
換句話說,你想做到這麼漂亮的短址轉換,不改 Apache 設定是不行滴
感謝wiseguy,那我就更改Apache設定的前題下去思考及規劃。
最近我有在研究 PHP 的 framework 就有你要的東西,
例如:Zend framework 和 CodeIgniter 都可以做到你要的東西,
不過都要學習 MVC 架構,ZF 我還看不太懂,CI 是比較容易入門的,
目前正在研究中…所以我也不太確定是不是你要的東西。
ZF 官方英文網站:http://framework.zend.com/
CI 非官方中文網站:http://www.codeigniter.org.tw/