2011-01-24 11 views
6

mod_rewrite wydaje się przekształcić symbolem Plus, zanim się go do $ _REQUEST, a ja nie wiem, co to naprawić ...Symbole PHP Mod_rewrite i zakodowane w adresie URL - mogą używać tylko jednej z nich, ale nie jednej i drugiej?

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,QSA] 

Na przykład, ja to wejście do mojego URL,

http://mywebsite/invite/xPo8lUEXpqg8bKL%2B32o6yIOK 

uzyskać to,

xPo8lUEXpqg8bKL 32o6yIOK 

ale jeśli wejście ten wniosek bez przechodzenia przez mod_rewrite,

http://mywebsite/invite.php?key=xPo8lUEXpqg8bKL%2B32o6yIOK 

uzyskać to, czego chcę,

xPo8lUEXpqg8bKL+32o6yIOK 

Co mogę zrobić? Czy jest to, że mogę używać tylko ich, ale nie obu?

Dzięki.

+0

Czy możesz wyjaśnić, co wprowadzasz i co otrzymujesz? –

+0

@Pekka: Przepraszam Poprostu poprawiłem moje błędy w powyższym piśmie i wyjaśniłem moje dane wejściowe. Dzięki. – laukok

+0

+1 interesujące pytanie - nigdy wcześniej się z tym nie spotkałem. –

Odpowiedz

3

spróbuj dodać [B] flagę (escape odwołania wstecznego):

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,B,QSA] 
+1

Tak, po prostu próbowałem, ale wciąż tak samo ... :( – laukok

1

Znak "+" jest zastrzeżona w ramach łańcucha zapytania z adresu URL jako przestrzeni. Rzeczywiście, status "+" jako zarezerwowany znak jest udokumentowany w rfc3986, a jego (dotychczasowe) użycie jako znaku zastępującego przestrzeń jest udokumentowane w rfc1630.

Ponieważ Apache próbuje uniknąć konfliktu, automatycznie usuwa "+" jako ciąg przed przekazaniem go.


Korzystanie flagę [NE] (NoEscape) na swoim przepisanie powinno zapobiec to zachowanie dzieje.

RewriteRule ^invite/([a-zA-Z0-9\-\+\/]+)/?$ invite.php?key=$1 [L,NE,QSA] 

Jednakże, używając tego, bez znaku "+" zostanie zastąpione spacją, jeśli użytkownik wpisze adres URL ręcznie. Aby być po bezpiecznej stronie, po prostu zamień wszystkie spacje na znakach "+".


Szczerze, ponieważ nie akceptują przestrzenie w wejściu, po prostu zamienić wszystkie spacje z symbolem „+”. Używanie flagi może wydobyć większe problemy niż proste zastąpienie znaków. Wystarczy prosty $_GET['key'] = str_replace($_GET['key'], ' ', '+');.

+0

dziękuję za to.Po prostu próbowałem, ale nadal nie ma szczęścia ... wszelkie inne opcje proszę ...? – laukok

+0

@lauthiamkok: Ponieważ nie akceptujesz spacji w swoim wejściu , prosty '$ _GET ['key'] = str_replace ($ _ GET ['key'], '', '+');' powinien wystarczyć, będzie to jedyne źródło twoich spacji. –

+0

dzięki za rozwiązanie str_replace :-) – laukok