Denerwujące jest, że na niektórych portalach:
Ostatnio programując sklep internetowy zastosowałem najprostszą technikę, która uwzględni oba powyższe punkty. W moim przypadku, gdy kontroler wymaga zalogowania się, warstwa ACL wskazuje na kontroler logowania (w zależności od konfiguracji). Natomiast URL zostaje, tj:
http://example.com/konto/dodaj-produkt.html
Pierwsze co trzeba zrobić, to sprawdzić, gdzie jest użytkownik. Jeżeli wywołujemy kontroler logowania pod powyższym adresem, trzeba porównać aktualny url do adresu logowania. W moim przypadku adresem logwania jest:
http://example.com/zaloguj.html
Aktualną pozycję użytkownika możemy sprawdizć w zmiennej $_SERVER['REQUEST_URI'], a adres logowania mamy z góry ustalony w naszej aplikacji. U mnie za adresu odpowiada router, stąd poniższy przykład przekierowania do strony logowania:
if(($sReq = $_SERVER['REQUEST_URI']) != ($sUrl = Vframe_Router::Route('auth_login')))
{
$this->_oUser->login_backlink = $sReq;
return $this->_redirect($sUrl);
}
UWAGA! Jeżeli przekierowujemy użytkownika do strony logowania, zamiast $_SERVER['REQUEST_URI'] sprawdzamy $_SERVER['HTTP_REFERER'].
Metoda _redirect to nic innego, jak wysłanie header Location. Dodatkowo do sesji użytkownika zapisuję adres, z którego użytkownik został przekierowany do strony logowania. Bardzo ważne jest to, żeby zapisać lokalizację tylko wtedy, gdy adres nie wskazuje na URL logowania, bo użytkownik po zalogowaniu zamiast powrócić do przegladanej strony, wróci do podstrony logowania.
Tuż po autoryzacji ustawiamy w sesji login_backlink na null, aby w przyszłości, gdy użytkownik wejdzie bezpośrednio na podstronę logowania, nie został odesłany do zapamiętanej wcześniej lokalizacji.
Mała modyfikacja aplikacji i nie denerwujemy użytkownika.
HTTP_REFERER jest często blokowany przez różnego rodzaju firewalle. Więc nie jest dobrze go używać.
Jest jedno ale, i dla tego są takie dziwne parametry w linkach. Chodzi o to że jak użytkownik wejdzie jednocześnie na parę stron wymagających logowania, po zalogowaniu we wszystkich zostanie przekierowany na tą ostatnio załadowaną.
Czytając ten wpis pomyślałem, że można zrobić coś jeszcze, po prostu nigdzie nie przekierowywać, tylko zmienić aktualnie wywołaną akcję na logowania, a ta po prostu odświeża stronę i jest wywoływana już normalnie skojarzona akcja.
Dzięki temu nie mamy brzydkich linków, a również jedno przeładowanie mniej też jest plusem.
jest jeszcze jeden mały minus:
- przy przekierowywaniu uruchamiasz cały kod ponownie … tylko po to aby URL wyglądał odpowiednio …
@itsme, słuszna uwaga, ale nie uruchamiam połączeń do baz danych itd, czyli de facto kod do wykonania jest leciutki. Ale dobrze, że to zauważyłeś, dlatego lepiej zastosować sposób jaki podał @Sędziwój, jest równie dobry i pozbawia problemu jaki podał @Michal Plachta.
przy duzych serwisach liczy sie wydajnosc a nie dlugosc linku, pozniej sie czlowiek tylko irytuje ze dlugo sie strony wczytuja… ehhh