Как да ескейпна забранените знаци в URL

creeds

New Member
Заявки със забранените знаци като &,+,# и т.н. не се изпълняват.
Пробвах с urlencode и urldecode - добре се енкодват примерно в %26 (+) но нещо не го приема.
Какъв трябва да ми е regex-a в .htacces - моят е (.*) ?
 
От: Как да ескейпна забранените знаци в URL

Я дай пример защото онези трите които си дал по-горе са си напълно нормални
 
От: Как да ескейпна забранените знаци в URL

Примерно URL-та като : http://localhost/article/fdffdffgd& или http://localhost/article/fdffdffgd + не се отварят.
Пробвах да ги енкодна със urlencode като ги insert-вам в базата данни и съответно 'fdffdffgd&' става fdffdffgd%26 или fdffdffgd + става fdffdffgd%20%2B.
След това ги декодирам с urldecode в Select заявката в $_GET['name'].
 
От: Как да ескейпна забранените знаци в URL

Тези са малко шибани. Направи си къстъм 404 хандлер през .htaccess и така ги парсвай.
 
От: Как да ескейпна забранените знаци в URL

Примерно URL-та като : http://localhost/article/fdffdffgd& или http://localhost/article/fdffdffgd + не се отварят.
Пробвах да ги енкодна със urlencode като ги insert-вам в базата данни и съответно 'fdffdffgd&' става fdffdffgd%26 или fdffdffgd + става fdffdffgd%20%2B.
След това ги декодирам с urldecode в Select заявката в $_GET['name'].

А бе колко още такива теми ще правите ?

Първо няма забранени знаци, а специални/резервирани тоест имат някакво допълнително предназначение. Това, което се опитвате да направите не може да стане по начина по който искате или поне не изцяло. Все пак, може да се ползва флага "B"(от apache версия 2.2) към директивата "RewriteRule", което ще кодира допълнително специалните знаци в заявката преди мапването с новия адрес.

Код:
# url: http://domain.bg/android/dasdas!@$&Dfsd<++>fssda=das 

RewriteRule ^android/(.*)$ index.php?page=android&name=$1 [B,L]

Така в $_GET['name'] ще имаш стойността "dasdas!@$&Dfsd<++>fssda=das". Щастието няма да е пълно, ако решиш да ползваш "?" някъде в адреса или пък "#". Първия е резервиран за оказване на началото на query string частта което без флага "QSA(Query String Append)" при тази директива няма да се добави към мапнатия адрес, но дори и с него няма да се добави в $_GET['name'] заедно със специалния знак както ти искаш да стане. Втория също си има свое предназначение, но той и всичко след него няма да се прати към сървъра.
За да може да стане това което искаш тези знаци трябва да бъдат екрнанирани/ескепнати иначе няма да се получи.

След това ги декодирам с urldecode в Select заявката в $_GET['name'].

Надявам се не правиш глупост от рода на "urldecode($_GET['name'])", стойностите в елементите на свръхглоблни като $_GET и $_REQUEST са автоматично декодирани.
 
От: От: Как да ескейпна забранените знаци в URL

А бе колко още такива теми ще правите ?

Първо няма забранени знаци, а специални/резервирани тоест имат някакво допълнително предназначение. Това, което се опитвате да направите не може да стане по начина по който искате или поне не изцяло. Все пак, може да се ползва флага "B"(от apache версия 2.2) към директивата "RewriteRule", което ще кодира допълнително специалните знаци в заявката преди мапването с новия адрес.

Код:
# url: http://domain.bg/android/dasdas!@$&Dfsd<++>fssda=das 

RewriteRule ^android/(.*)$ index.php?page=android&name=$1 [B,L]

Така в $_GET['name'] ще имаш стойността "dasdas!@$&Dfsd<++>fssda=das". Щастието няма да е пълно, ако решиш да ползваш "?" някъде в адреса или пък "#". Първия е резервиран за оказване на началото на query string частта което без флага "QSA(Query String Append)" при тази директива няма да се добави към мапнатия адрес, но дори и с него няма да се добави в $_GET['name'] заедно със специалния знак както ти искаш да стане. Втория също си има свое предназначение, но той и всичко след него няма да се прати към сървъра.
За да може да стане това което искаш тези знаци трябва да бъдат екрнанирани/ескепнати иначе няма да се получи.



Надявам се не правиш глупост от рода на "urldecode($_GET['name'])", стойностите в елементите на свръхглоблни като $_GET и $_REQUEST са автоматично декодирани.

Наистина помогна много с този флаг B.Благодаря ти!

Надявам се не правиш глупост от рода на "urldecode($_GET['name'])", стойностите в елементите на свръхглоблни като $_GET и $_REQUEST са автоматично декодирани.

Да точно това правя!
Сега как мога да използвам urlencode за да изглежда по нормално URL адреса.
 
От: Как да ескейпна забранените знаци в URL

Задача на сървъра е да се грижи за декодирането на рикуестите, не на PHP. Не знам с Apache ли си, но предполагам че си. Специално тоя символ & както знаем стандартно се ползва за разделяне на GET променливи (?variable1=value&variable2=value) и като е написан в чистия си вид Apache се грижи да го използва точно като разделител и той въобще не достига до PHP. Сега ти ако искаш тотално да изключиш тия променливи от играта и да си въвеждаш твои стандарти... честно казано не знам как и дали е възможно. Виж че дори като се прави Rewrite на адреса, в крайна сметка частите от него се набутват точно в такива променливи като се ползват ? и &.

Ето малко четиво: https://wiki.apache.org/httpd/RewriteQueryString

Ако просто искаш да генерираш изчанчени уникални линкове като в YouTube, тогава си намери функция дето да генерира кодове само от букви и цифри. Тея ? и & просто не трябва да присъстват, твърде системни са. Но дори някак си да успееш да накараш Apache да не ги мисли като системни и за твоя сървър да са все едно обикновени букви, то как ще накараш Google да ги разбира по твоя начин когато индексира сайта :)
 
От: От: Как да ескейпна забранените знаци в URL

В query параметъра "name" може да присъства всеки един резервиран/специален знак стига той да бъде кодиран/екраниран, като след това може да бъде достъпен декодиран отново в $_GET['name'] в пихипи.

Примера който давам е с примерната директива RewriteRule, която съм дал в по-горния си пост и флага "B".

Код:
url: http://domain.bg/android/das%3Fda%3Fs!@$&Dfs%23d<++>fs%23%23sda=das

$_GET['name'] : "das?da?s!@$&Dfs#d<++>fs##sda=das"

Благодарение на режима/флага "B" е необходимо да екранираш само "?" и "#". По-добрия начин обаче е да екранираш всички специални знаци, защото ясно и точно определяш информацията която url адреса ще предоставя, освен за сървъра така и за търсачки, паяци и т.н.:

Код:
url: http://domain.bg/android/das%3Fda%3Fs%21%40%24%26Dfs%23d%3C%2B%2B%3Efs%23%23sda%3Ddas

$_GET['name'] : "das?da?s!@$&Dfs#d<++>fs##sda=das"

Затова бях казал и в предишната тема да си нормализираш адресите.

Сега как мога да използвам urlencode за да изглежда по нормално URL адреса.

Ако приемем, че запазваш тези имена на страници декодирани тоест записваш директно стойността на $_GET['name'] (в случая "dasdas!@$&Dfsd<++>fssda=das") то може да образуваш url адрес по следния начин:


PHP:
$path_segment_part = 'dasdas!@$&Dfsd<++>fssda=das'; // стойността си я взимаш от база данни
$url = 'http://domain.bg/android/' . urlencode($path_segment_part);
 

Горе