Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][.htaccess] Linki w adresie Url
Forum PHP.pl > Forum > Przedszkole
Poker
Witam serdecznie,

natknąłem się na dosyć nie ciekawy problem i nie mogę sobie z nim poradzić, szukałem i nadal szukam od kilku godzin i nie potrafię znaleźć rozwiązania swojego problemu.

Otóż w adresie będę chciał przesyłać dodatkowe linki, do różnych stron typu:

http://www.mojastrona/szukaj/na-stronie/http://fakty.interia.pl/swiat/news/turcja-zakonczyla-poszukiwania-601-ofiar-trzesienia-ziemi,1714944,4

Pierwsza pogrubiona część oczywiście działa do momentu kiedy nie podam dalszej części z ukośnikiem /


Tak więc adres:
http://www.mojastrona/szukaj/na-stronie/fakty.interia.pl

Działa poprawnie, ale adres:
http://www.mojastrona/szukaj/na-stronie/fakty.interia.pl/

Już niestety nie działa.


Mój .htaccess wygląda nastepująco:

Kod
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domena.pl
RewriteRule (.*) http://www.domena.pl/$1 [R=301,L]

RewriteRule ^szukaj/(.*)/(.*) szukaj.php?typ=$1&link=$2
RewriteRule ^szukaj/(.*) szukaj.php?typ=$1
RewriteRule ^szukaj szukaj.php


Czy jest ktoś w stanie pomóc mi w tym problemie, aby mógł bez żadnego problemu pobierać ten adres znajdujący się pod $_GET['link'] ?

Z góry bardzo dziękuję za pomoc lub nakierowanie.


--------------------------
Edycja
--------------------------

Dodałem flagę [R] by sprawdzić dokładnie przekierowanie i widzę

Cytat
szukaj.php?typ=na-stronie/http:&link=www.990px.pl/
iro88
Z podwójnym slashem jest mały problem, bo w necie sporo artykułów na temat tego jak się ich pozbyć z adresu, a nie ma ani jednego o tym jak umożliwić jego występowanie w adresie - tak by trafiał w takiej postaci do $_GET'a. Ale da się to jakoś obejść niezbyt ładnym sposobem - chyba liczy się efekt ;>

CODE

#Gotowa reguła:
RewriteRule ^szukaj/([a-zA-Z0-9\-]+)/http(\:)/([a-zA-Z0-9\-\./]+) szukaj.php?typ=$1&link=http$2//$3 [L]

#Reguła nieprzekazująca podwójnych slash'y (//) do GET'a, ale w adresie nie przeszkadzają:
RewriteRule ^szukaj/([a-zA-Z0-9\-]+)/([a-zA-Z0-9\-\:\./]+) szukaj.php?typ=$1&link=$2 [L]

#Testowane na adresie:
#/szukaj/jakis-typ/http://costam-costam.pl


btw. jakby ktoś miał bardziej elegancki sposób to z ciekawości chętnie zobaczę.

EDIT:
Na przyszłość dorzucę bardzo przydatny link: http://wyrazeniaregularne.wordpress.com/
by_ikar
Problemem u autora tematu jest to że w pierwszym dopasowaniu podaje ".*" czyli dowolny zakres znaków, efektem czego jest łapanie wszystkiego przez pierwsze dopasowanie. Rozwiązać można by to w ten sposób:

Kod
RewriteRule ^szukaj/([\w\-]+)/(.*) szukaj.php?typ=$1&link=$2 [NC,L]


W efekcie czego powinno łapać wszystko, testowałem dla adresu:

Kod
http://localhost/szukaj/na-stronie/http://www.jakas-strona.com/jakas/podstrona/


efekt:

Kod
array
  'typ' => 'na-stronie'
  'link' => 'http:/www.jakas-strona.com/jakas/podstrona/'


Możecie również przepuścić dane przez urldecode/urlencode w efekcie czego zamiast takiego adresu:

Kod
http://localhost/szukaj/na-stronie/http://www.jakas-strona.com/jakas/podstrona/


Otrzymacie taki:

Kod
http://localhost/szukaj/na-stronie/http%3A%2F%2Fwww.jakas-strona.com%2Fjakas%2Fpodstrona%2F


I jeszcze podgląd wyrażenia: http://regexr.com?2v2j1

Generalnie w adresie url, zaraza po domenie (host, czyli domena, lub domana plus www), można podać dosłownie każdy jeden znak, co jest opisane w dokumencie rfc 1738: http://tools.ietf.org/html/rfc1738

Dodatkowo, żeby nasze wyrażenie dopasowało duże lub małe znaki, wcale nie musimy za każdym razem pisać "a-zAZ", wystarczy że dodamy dodatkową flagę dla naszego dopasowania: NC wink.gif
iro88
Cytat(by_ikar @ 31.10.2011, 09:15:34 ) *
efekt:

Kod
array
  'typ' => 'na-stronie'
  'link' => 'http:/www.jakas-strona.com/jakas/podstrona/'

Sam widzisz, że po http: nie ma // tylko pojedynczy slash, więc podana przeze mnie pierwsza reguła robi dokładnie to samo. Oczywiście u Ciebie krócej zapisane, ale ja nie mam zaufania do (.*), wolę walidować dane już na tym etapie.

Cytat(by_ikar @ 31.10.2011, 09:15:34 ) *
Dodatkowo, żeby nasze wyrażenie dopasowało duże lub małe znaki, wcale nie musimy za każdym razem pisać "a-zAZ", wystarczy że dodamy dodatkową flagę dla naszego dopasowania: NC wink.gif

Nie wiem czy to przez moje niedoczytanie czy tak wspaniałej umiejętności czytania w języku angielskim, ale zawsze flagę [nc] kojarzyłem z brakiem dużych znaków i odbierałem to jako [No Capse]. Dzięki.

EDIT:
Podsumowując:
Kod
#dla adresów z http:// z przodu
RewriteRule ^szukaj/([a-z0-9\-]+)/http(\:)/([a-z0-9\-\./]+) szukaj.php?typ=$1&link=http$2//$3 [L,NC]

#dla adresów bez http:// z przodu
RewriteRule ^szukaj/([a-z0-9\-]+)/([a-z0-9\-\./]+) szukaj.php?typ=$1&link=$2 [L,NC]
by_ikar
Cytat
Sam widzisz, że po http: nie ma // tylko pojedynczy slash, więc podana przeze mnie pierwsza reguła robi dokładnie to samo. Oczywiście u Ciebie krócej zapisane, ale ja nie mam zaufania do (.*), wolę walidować dane już na tym etapie.


Heh, ślepy od samego rana jestem wink.gif dopiero teraz to zauważyłem.. Nie mniej, podałem alternatywę, czyli urldecode/urlencode. A dlaczego ten jeden slash jest usuwany, szczerze mówiąc nie wiem. Nie wiem czy to dzieje się na poziomie apache, czy na poziomie php. Całość mojego poprzedniego posta odniosła się do pierwszego posta w tym temacie, bo tam zauważyłem zachłanne wyrażenie które było tamtym problemem, i szczerze mówiąc do końca twojego posta nie przeczytałem, to i twój problem ominąłem.

Nie mniej, wydaje mi się że nie trzeba wpisywać ani http, ani www wystarczy sama strona tak jak w pierwszym poście jest:

Kod
http://www.mojastrona/szukaj/na-stronie/fakty.interia.pl


A dorzucić do tego w php http to raczej dla nikogo żaden problem wink.gif ten podwójny slash jest kasowany przez htaccess, jak to ominąć póki co nie wiem.
Poker
Bardzo dziękuje Wam za pomoc, wczorajszą nockę spędziłem na googlowaniu ale niestety nic sensownego nie znalazłem.
Sposób iro88 jest bardzo dobry dla tego co chcę zrobić, tak więc bardzo dziękuje.

Problemem u mnie właśnie jest to że muszę podsyłać pełne adresy.


urldecode/urlencode byłoby świetnym rozwiązaniem gdybym to ja podsyłał w linkach adresy i sam muszę jeszcze dokładnie przemyśleć działanie swojego skryptu bo nie ukrywam że to również może mi pomóc.

Tak więc wielkie podziękowania za rozwiązanie mojego problemu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.