2010-01-08 134 views
2

我一直是這樣,現在掙扎了兩天。的.htaccess國防部重寫規則和&

目前我有以下重寫規則:

RewriteRule ^(.*)$ index.php?u=$1 [NC,L] 

哪些端口一切背後example.com/到index.php作爲GET變量u。這是在index.php中正在處理與爆炸以限定TE不同的參數是:連接的位置(第二個參數)

此完全適用於以下網址城市(第一斜線之間):

example.com/City/location/或example.com/City/location
example.com/City/或example.com/City

主要生產:

$arg[0] = city 
$arg[1] = location 

問題發生的要價較高時離子具有and符中的位置名稱:

example.com/city/location&more 

轉換爲:

index.php?u=city/location&more 

的問題是顯而易見的;我可以因爲位置名稱的第二部分沒有存儲在$ _GET [「U」]沒有的index.php再使用爆炸參數。

我該如何解決這個問題?

我覺得三個解決方案,我不知道如何實現:
1)重寫重寫規則的城市和地點分開使用進行urlencode的的.htaccess相當於改造的.htaccess
2)在& -sign爲%26
3)一個完整的其他解決辦法:)
Thanx提前!

編輯 首先: 當鏈接是由我的網站產生的它被翻譯用urlencode。所以不存在&那裏不應該有一個。 的&是業務的一部分namen這樣的:「百吉餅&豆」 當人們想搜索這家公司,他們鍵入:www.example.com/city/bagels &豆在URL字段。 ,這就是問題的開始。

編輯2 當我去:example.com/city/bagels%26Beans 將其轉換爲以下內容:$ _ GET:

Array 
(
    [u] => city/Bagels 
    [Beans] => 
) 

編輯3 我爆炸的方式$ _GET ['u']形成參數。

$arg = explode('/',$_GET['u']); 
+0

你用於爆炸的PHP代碼是什麼? (你在爆炸?) – 2010-01-08 12:55:27

+0

我已經把它放在我的問題,在編輯3 – blub 2010-01-08 13:07:22

回答

3

您不需要將URL路徑放入參數中。你可以簡單的分析是這樣的原請求的路徑:

$_SERVER['REQUEST_URI_PATH'] = strtok($_SERVER['REQUEST_URI'], '?'); 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 

現在,所有你需要的是這個規則的要求重寫你的index.php

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^index\.php$ index.php [L] 

的附加條件是隻重寫無法映射到現有文件的請求。

0

因爲這個原因,你不應該有&作爲URL的一部分。&具有特殊含義,並且應該在您的網站上將其置於a標記中的任何時候進行urlencoded(至%26),以便您永遠不要在URL中看到它實際上以&的身份出現。

基本上,我說的是,不要在你的htaccess中處理這個問題,在任何不好的代碼中允許將&作爲URL的一部分輸出。

+0

每次我從數據庫中產生的名字我urlen代碼到%26。但即便如此,它也會出錯 - 請看看我的編輯 – blub 2010-01-08 12:46:08

2

首先第一件事情:

example.com/city/location&more 

是不是有效的查詢字符串。你應該?開始查詢字符串,像這樣:

example.com/city/location?more=value&more2=value2 

二是在mod_rewrite的改性劑,以確保查詢字符串獲得附加到新重寫網址,這是QSA(意爲追加查詢字符串)。您的重寫規則看起來像:

RewriteRule ^(.*)$ index.php?u=$1 [NC,QSA,L] 
+0

&符號是名稱的一部分,而不是爭論! – blub 2010-01-08 12:45:07

+0

@blub:在這種情況下,您必須對&符號進行編碼。 – 2010-01-08 12:49:12

+0

看看我的第二次編輯:即使我編碼到%26 GET變量出錯。 – blub 2010-01-08 12:50:47

2

你可以嘗試使用$ _SERVER [「REQUEST_URI」],而不是實際的$ _GET參數。

if(preg_match("%\?u=(.*)$%", $_SERVER["REQUEST_URI"], $Matches)) { 
    $Test = explode("/", $Matches[1]); 
    var_dump($Test); 
} 

對於 「的index.php U =測試/ testlocation &更?」 這將輸出:

陣列(2){[0] =>串(4) 「試驗」[1 ] => string(17)「testlocation & more」}