PHP中$_GET與Header方法可能遇到的問題

假設有一個網址是www.jiashe.com?type=c++javascript

若是想要獲取type的值,咱們知道:php

var_dump($_GET['type']);

然而,結果倒是:html

能夠看出來,應該輸出c++的,卻輸出了c空格空格。java

下面分析一下這個過程:c++

當咱們在瀏覽器中輸入www.jiashe.com?type=c++這個URL以後,瀏覽器首先須要對這個URL進行編碼。編碼的規則是對非ASCII碼以%加2個十六進制數。好比:瀏覽器

www.jiashe.com?type=c ++(c後有一個空格)函數

瀏覽器會將其編碼成:編碼

www.jiashe.com?type=c%20++(空格用%20代替)url

中文也都有相應的編碼。code

$_GET['type']獲取的是什麼?它獲取的不是編碼以前的type的值,而是編碼後type的值,獲取到值後再進行反編碼。

未編碼以前type的值是c++,編碼以後type的值仍是c++。

這裏說一下,c和+都是ASCII碼,因此沒有進行編碼。但實際上,每個ASCII都有對應的十六進制表示的。在PHP中,進行URL編碼的函數是:

echo urlencode('c++');
結果是:c%2B%2B

在JS中,進行URL編碼的函數是:

console.log(encodeURI('c++'));
結果是:c++

可見,不一樣語言編碼後效果是不同的。PHP將+進行了編碼,而JS中沒有對+進行編碼。

而剛纔輸入網址,瀏覽器也是沒有對+進行編碼。而後$_GET['type']對c++進行解碼。瀏覽器又把++反編碼成空格了。

這裏會很奇怪:+的編碼是%2B,爲何會解析成空格呢?空格的編碼是%20,可是URL編碼一般用+代替空格(參考:http://www.runoob.com/tags/html-urlencode.html,裏面的原話)。也就是說,若是咱們在瀏覽器中輸入:www.baidu.com?type=c vb既能夠編譯成

www.baidu.com?type=c%2Bvb(將空格編碼成%2B),也能夠

www.baidu.com?type=c%+vb(將空格編碼成+)

因此,咱們對c++進行反編譯的時候,瀏覽器又認爲這個+是由空格編碼過來的,因此又反編譯成了空格,這就致使了一開始出現的問題。

其實,問題的根源就在於編碼不是一對一。+和%2B是一對,+又和空格是一對,致使錯誤。

而-就不會出現這種問題。那該怎麼辦呢?

只要咱們傳的時候已經對+進行編碼便可。

咱們先對c++進行編碼變成c%2B%2B,這樣,解析的時候就會還原成+。

可是怎麼對c++編碼呢?剛纔說了,有的語言(JS)不對++進行編碼,而有的(PHP)又對++進行編碼。這裏其實能夠簡單地用字符串替換,將+換成%2B:

<?php
   str_replace('+','%2B','c++');
?>

這樣,咱們輸入的網址就是www.jiashe.com?type=c%2B%2B,瀏覽器對其編碼仍是不變,最後反解碼時%2B就變成了+。

注意,php的這個函數很厲害,它能將全部的+都替換成%2B。而JS中字符串的替換函數replace只能替換第一個+號,後面的+號就不能替換了,全部JS中的replace的第一個參數一般須要用正則匹配。

Header方法也是同樣,用Header進行頁面跳轉時,其URL須要被編碼,若是URL中含有+符號,必定記着先把+換成%2B,不然可能出現錯誤。

相關文章
相關標籤/搜索