2012-12-05 77 views
1

我在.htaccess重寫規則的.htaccess URL編碼字符串不傳遞到頁面正確

RewriteRule ^page/(.*)$ my-php-page.php?cid=$1

我傳遞包含了像=+字符的編碼字符串 - 這是編碼字符串;

V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

當完整的URL是

http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

現在,這並不因爲+標誌的工作。所以我想發送urlencoded的cid,然後變成;

http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY

+跡象變得%2B。這很好用,除非我在.htaccess中通過RewriteRule嘗試這種方式 - 它不起作用。因此,URL將

http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2%2B6YUtLf2KCh4eKY

的mypage.php文件實際收到cidV1ihnKpip6WpnY7Wm5zn2 6YUtLf2KCh4eKY因爲某些原因需要用一個空格代替%2B

任何想法,爲什麼它可能會這樣做?我該如何解決這個問題。非常感謝您的幫助。

編輯

我剛剛發現這個解決方案 - PHP $_GET var with urlencode and "&" bug - 但我不知道是否有在.htaccess一個更優雅的解決方案不必urlencode字符串兩次?

+0

您的重寫規則以'page'開頭,但您的URL以'some-page /'開頭 – undone

+0

不,它不是,前2個URL示例直接鏈接到PHP文件,它不使用重寫。我重寫了這個問題,因爲我的示例URL有點混亂。 – Wasim

回答

9

嘗試添加B重寫標誌。這個標誌告訴mod_rewrite的逃脫後向引用時,documentation says this

_rewrite具有映射他們之前未逸出的網址,所以反向引用將它們應用的時間來轉義。使用B標誌,反向引用中的非字母數字字符將被轉義。

由於%字符被保留用於反向引用到RewriteCond聲明前述的RewriteRule匹配分組,mod_rewrite的對待他們不同,最終可能會嘗試與一個空白反向引用來代替%2

所以您的規則應該是這樣的:

RewriteRule ^page/(.*)$ my-php-page.php?cid=$1 [B] 
+0

PHP將+解釋爲空格,因爲歷史上在RFC 3986之前將+用於URL中的空格。 – Gerben

+0

謝謝!!!這對我有用! ':)' –

0

如果我的理解沒錯,重定向此URL:

http://www.example.com/page/V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY這一個

http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

RewriteEngine On 
RewriteRule ^page/([^/]*) http://www.example.com/my-php-page.php?cid=$1 [L] 

的結果是:

http://www.example.com/my-php-page.php?cid=V1ihnKpip6WpnY7Wm5zn2+6YUtLf2KCh4eKY

參數沒有變化。