2012-07-06 58 views
0

我有一個顯示新聞內容的網頁。頁面的URL看起來像 example.com/news.php?newsid=iphone4-releases。我想要的網頁是通過這樣的URL訪問:example.com/news/iphone4-releases通過替換GET變量縮短URL

我在.htaccess文件

RewriteCond %(REQUEST_FILENAME) !-d [OR] 
RewriteCond %(REQUEST_FILENAME) !-f [OR] 
RewriteCond %(REQUEST_FILENAME) !-l 

RewriteRule .* - [L] 

RewriteRule ^(.*)$ http://example.com/news.php?newsid=$1 [NC] 

這段代碼實際上取代了URL做出這些改變,但我想保持不相同的URL GET變量。此外,使用這種方法的URL變得example.com/iphone4-releases但我想example.com/news/iphone4-releases

回答

0

這樣做,假設你只使用AZ,數字和在你的文章的名字破折號:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^news/([a-zA-Z0-9\-]*)$ /news.php?newsid=$1 [NC] 

編輯:

此鏈接解釋了有關的參數: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond

約在-l:

'-l'(是符號連接)將TestString視爲一個路徑名和測試 是否存在,並且是一個符號鏈接。

和數量將在這個例子中工作(例如/新聞/ iphone2003全新推出)

我很抱歉,但我是一個匆忙:)

+0

我在NewSID的使用數字了。你能解釋爲什麼你刪除!-l從重寫條件(以及它的作用) – 2012-07-06 13:09:29

0

也許你將需要刪除這兩個[OR],因爲你要請求的文件不被文件,而不是爲目錄,而不是成爲一個符號鏈接

RewriteCond %(REQUEST_FILENAME) !-d 
RewriteCond %(REQUEST_FILENAME) !-f 
RewriteCond %(REQUEST_FILENAME) !-l 

RewriteRule ^/(\w+)/(.*?)/?$  $1.php?newsid=$2 [NC,L] 

,你不需要全域爲您的規則裏面

0

你不能指望忽略GET變量並使用.htaccess做一個303重定向,因爲重定向會失去你的變量。你可以做的是用POST提交一個表單到你要重定向到的頁面,並創建一個從該頁面到真正的PHP腳本的符號鏈接,然後然後創建一個重寫規則來重定向客戶端的瀏覽器。

這是你上面的重定向,納入補充/news/部分:

RewriteEngine On 
RewriteBase/
RewriteCond %(REQUEST_FILENAME) !-d [OR] 
RewriteCond %(REQUEST_FILENAME) !-f [OR] 
RewriteCond %(REQUEST_FILENAME) !-l 

RewriteRule .* - [L] 

RewriteRule ^(.*)$ news/news.php?newsid=$1 [NC] 

您也可以只使用PHP做了重新定位:

header("Location: http://www.redirecthere.com");