2011-07-29 33 views
1

我正在運行PHP5.3.6和IIS7。我目前正在一個以產品爲中心的網站上工作,我有一個基於查詢字符串(如/product.php?id=12345)動態生成頁面的php頁面。使用PHP和IIS7創建SEO和人類freindly /可讀的URL

我在數據庫中擁有的產品數量各不相同,但數量上有所不同。他們有唯一的ID和名稱。

我希望每個頁面都是通過它們的名稱代替查詢字符串的地址。

例如,而不是:

/product.php?id=12345 

我寧願:

/acme-super-widget-in-blue-with-cool-groovy-gadget-attachment 

我在IIS7的URL Rewrite組件,但我不想手動輸入值。我寧願有一個動態的過程。我相信這裏需要的功能是向web.config文件添加一個URL重寫規則,但我不確定這是否爲真或最佳方法。

謝謝。

回答

1

我會建議使用ID和名稱一起使用,以便您可以支持具有相同名稱的產品(將來打樣)或具有非ascii字符的產品......應該有國際名稱。我還建議現在只使用URL中的ascii字符,因爲我注意到一些網站和瀏覽器傾向於將非ASCII字符擴展爲醜陋的百分比編碼。

IIS 7比Apache的麻煩了一點,但我認爲這可能爲你工作http://blogs.iis.net/bills/archive/2008/05/31/urlrewrite-module-for-iis7.aspx

下面是一個例子重寫規則,將剝離的名字從ID,只是ID傳遞給腳本。

IIS 7中的鏈接使用模塊上方

匹配URL

^([0-9]+)[^/]*/?$ 

行動

index.php?id={R:1} [QSA,L] 

阿帕奇剛剛好messure;)

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([0-9]+)[^/]*/?$ index.php?id=$1 [QSA,L] 

這是一個PHP函數,它將生成友好URL的id名稱部分。

function friendlyURL($id, $title) { 

    $string = $title; 
    $paramcount = func_num_args(); 
    for ($i = 2; $i < $paramcount; $i++) { 
     $string .= "-" . func_get_arg($i); 
    } 
    $string = preg_replace('`&(amp;)?#?[a-z0-9]+;`i', '-', $string); 
    $string = htmlentities($string, ENT_COMPAT, "utf-8"); 
    $string = preg_replace("`&([a-z]+);`i", "", $string); 
    $string = preg_replace("`['\[\]]`", "", $string); 

    $tmp = $string; 
    $string = preg_replace(array("/[^A-Za-z0-9]/", "`[-]+`"), "-", $string); 

    $string = trim($string, '-'); 
    return trim($id . "-" . $string, '-'); 
} 

這將使你的URL喜歡

產品ID = 12345 NAME = 「極致超小工具」

/12345-acme-super-widget/ 

產品ID = 12345 NAME = 「日本產品ギター」

/12345-japanese-product/ 
+0

This code is fantastic;謝謝。由於網站的動態特性,我無法通過IIS7控制面板手動添加條目。使用PHP將適當的重寫規則添加到web.config文件的最佳方式是什麼?再次感謝。 –

+0

我從來沒有測試過這個選項,但據說它處理所有Apache樣式的mod重寫選項和每個目錄使用.htaccess文件。 http://www.micronovae.com/ModRewrite/ModRewrite.html – AWinter