iT邦幫忙

0

如何以PHP 程式 實現簡捷網址

ali88 2011-06-25 19:45:5817154 瀏覽
  • 分享至 

  • xImage

各位程式高手:
最近接一個專案,需用到簡潔網址(short url)。但網路上大部分都是以Apache的Rewrite模組方式實現,假若不要使用Rewrite模組方式,完全以PHP程式來達到簡潔網址可行嗎?
假若可以的話,是要如何實現。謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
16
wiseguy
iT邦超人 1 級 ‧ 2011-06-25 21:20:39
最佳解答

你的問題不是說的很清楚。
我假設你是有個站台 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 做到,能不用就不用。

看更多先前的回應...收起先前的回應...
ali88 iT邦新手 3 級 ‧ 2011-06-26 10:42:54 檢舉

感謝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

wiseguy iT邦超人 1 級 ‧ 2011-06-26 12:03:36 檢舉

當然可以啊。
如果你就是要用 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 該做的事

其它字串的對應就依此類推囉。

wiseguy iT邦超人 1 級 ‧ 2011-06-26 12:10:34 檢舉

補充說明,
因為我不知道你想要的效果。
假設原網址 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');
}

即可。

ali88 iT邦新手 3 級 ‧ 2011-06-26 13:01:23 檢舉

有試過第二個方法。
原網址 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網址的狀態。

logoooit iT邦新手 4 級 ‧ 2011-06-26 16:04:51 檢舉

你用header的方式轉換位置,當然不會保持在B網站

logoooit iT邦新手 4 級 ‧ 2011-06-26 16:07:17 檢舉

http://example.tw/?pro 這樣難道不好嗎?疑惑

8
logoooit
iT邦新手 4 級 ‧ 2011-06-26 10:30:02

如果機器上不能使用 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 即為參數,只要判斷參數,就可以做後續的處理

ali88 iT邦新手 3 級 ‧ 2011-06-26 17:10:08 檢舉

找一個範例網站
http://www.puda.com.tw/hotels/page-1/
http://www.puda.com.tw/residence/page-1/
其網址後面都沒有php?name=1&arg=....等參數傳遞,這就是目前所期望效果。

wiseguy iT邦超人 1 級 ‧ 2011-06-27 11:02:13 檢舉

這就是為什麼我一開始就要你使用 AliasMatch 做轉向的原因。
因為要把所有亂七八糟的 URL 通通轉到一支 PHP 做處理。
如果你不做這一動,那就算用我後來補充的第一種方式,即使可以做到 /index.php/xxx,也不漂亮,還是會有 index.php 這樣的字秀出來。
換句話說,你想做到這麼漂亮的短址轉換,不改 Apache 設定是不行滴 No

ali88 iT邦新手 3 級 ‧ 2011-06-28 10:29:35 檢舉

感謝wiseguy,那我就更改Apache設定的前題下去思考及規劃。

6
Tiger
iT邦研究生 5 級 ‧ 2011-06-27 10:40:29

最近我有在研究 PHP 的 framework 就有你要的東西,
例如:Zend framework 和 CodeIgniter 都可以做到你要的東西,
不過都要學習 MVC 架構,ZF 我還看不太懂,CI 是比較容易入門的,
目前正在研究中…所以我也不太確定是不是你要的東西。

ZF 官方英文網站:http://framework.zend.com/
CI 非官方中文網站:http://www.codeigniter.org.tw/

我要發表回答

立即登入回答