• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Pytanie dotyczące linków, routingu, etc.

0 głosów
171 wizyt
pytanie zadane 5 września 2016 w PHP, Symfony, Zend przez CzikaCarry Szeryf (75,440 p.)
zamknięte 5 września 2016 przez CzikaCarry
Zapewne banalne pytanie, ale odpowiedzi na nie sam wykoncypować nie potrafię, potrzebuję pomocy.

Pewnego dnia naszła mnie pewna myśl: Jakim prawem te linki działają? Przykładowy link: http://forum.pasja-informatyki.pl/176633/projekt-aplikacji-internetowej

Zakładam, że katalog "176633", oraz plik o nazwie "projekt-aplikacji-internetowej" nie istnieje, zapewne jest to request ze zmiennymi wysyłanymi metodą GET do pliku xyz.php, który na podstawie tych zmiennych wyciąga z bazy treść pytania, ilość wyświetleń etc. Link ten bez użycia Mod_rewrite wyglądałby zapewne mniej więcej tak:

http://forum.pasja-informatyki.pl/xyz.php?id=176633&name=projekt-aplikacji-internetowej

Użycie mod_rewrite jest w tym przypadku oczywiste, ale przy takim forum, gdzie sitemap generuje mi się od dłuższego czasu używanie takiej metody mija się z celem. Aby to działało, ktoś musiałby siedzieć i 24/7 przepisywać linki. Jak to jest zrobione? Zapewne jakoś w php, chciałbym zrobić coś takiego, ale nie wiem jak to ugryźć, po prostu :D Z góry dzięki za jakikolwiek odzew :)
komentarz zamknięcia: uzyskałem satysfakcjonujące odpowiedzi.

2 odpowiedzi

+5 głosów
odpowiedź 5 września 2016 przez Comandeer Mentor (452,460 p.)

Najlepiej jest serwerowi wklepać regułkę, żeby każde żądanie, które nie pasuje do fizycznego pliku, leciało przez plik index.php (w Apache osiągniesz to przy pomocy mod_rewrite, w nginxie regułką try_file). Kiedy już takie żądanie przyjdzie do index.php, po prostu dopasowujesz je do przygotowanej listy z adresami (która może zawierać np. adresy z wyrażeniami regularnymi; w sumie wszystko może zawierać, bo to przeca kod jest ;)) i zwracasz odpowiednią stronę (jeśli dopasujesz wpis albo rzucasz błędem 404.

komentarz 5 września 2016 przez CzikaCarry Szeryf (75,440 p.)

Dzięki wielkie za opowiedź.

Kiedy już takie żądanie przyjdzie do index.php, po prostu dopasowujesz je do przygotowanej listy z adresami

Czyli jak dobrze rozumiem tablica linków / 'SELECT trescstronyorsomeshit FROM strony WHERE adres="adres"'?

 

komentarz 5 września 2016 przez Comandeer Mentor (452,460 p.)

Routing to lista regułek, które pozwalają dopasować treść do adresu, np. masz regułkę artykul/<id> (gdzie <id> to ładny sposób zapisu wyrażenia regularnego typu ([0-9]+)). I teraz user wchodzi pod adres http://twojastrona.pl/artykul/15. Twój routng wykrywa, że ten adres pasuje do tej regułki i robi to, co jest określone dla tej regułki (tworzy odpowiedni kontroler, który odwołuje się do odpowiedniego modelu itd.).

komentarz 5 września 2016 przez CzikaCarry Szeryf (75,440 p.)
A tak btw. trochę offtop zrobię, bo nie chcę pisać nowego tematu na taką pseudobłahostkę, a mianowicie system "zapamiętaj mnie". Ciastka, wiem, że użyć ich muszę, ale zabezpieczenia. Używać gotowych rozwiązać,czy na podstawie stałych danych z bazy takich jak data rejestracji, login, adres e-mail, data urodzenia, kąt nachylenia słońca na Honolulu w czasie pierwszej pełni po dacie urodzin etc. generować token, który byłby przepustką do strony? Miałby to być taki pseudohash, który byłby później jeszcze raz hashowany. Po uzyskaniu takiego ciastka, na podstawie ID w nim zawartego serwer wyciągałby dane z bazy, generowałby token, hashował go, a następnie sprawdzał czy CiastkoToken == WygenerowanyToken. W takiej sytuacji, gdyby ktoś jakimś cudem zdumpował bazę danych z serwera na swój komputer, bez kodu PHP nic by nie zdziałał. Oczywiście mógłby brute force na hasło robić, ale mówię tutaj o podszywaniu się pod czyjeś ciastka. Dane z bazy nic by mu nie dały, nie wiedziałby, jak jest generowany  ten token, zatem nie ułatwiłoby mu to ciastkowego ataku na konta userów :)
komentarz 5 września 2016 przez Comandeer Mentor (452,460 p.)
Akurat to bardzo rozlegly temat i zasługuje na osobny wątek ;)
–1 głos
odpowiedź 5 września 2016 przez Thomas Frost Bywalec (2,520 p.)
Cześć,

​Plik ".htaccess" umożliwia korzystanie z tzw. "Rewrite Engine", działa mniej więcej w taki sposób jak DNS (tj. podmienia tekst/liczby na zadany ciąg znaków) z wykorzystaniem Regular Expressions!

Pozdrawiam,
​Tomek
komentarz 5 września 2016 przez CzikaCarry Szeryf (75,440 p.)
Hmmm. Jeśli dobrze rozumuję, to nie muszę wpisywać tam wszystkich linków przed i po zamianie, tylko regexem wycinam duperelki typu "?name=" i zamieniam na "/"? Jeśli tak, to wszystko układa się w jedną całość. Czy da się to zrobić w PHP, czy trzeba bawić się w .htaccess? :D
komentarz 5 września 2016 przez Thomas Frost Bywalec (2,520 p.)
Cześć,

​To co, kiedyś wielki uczony Konfucjusz powiedział "To co jest w .htaccess'ie, zostaje w .htaccessie!". Tak po prostu jest lepiej, to dosłownie mogą być 3-5 linijek w htaccessie i już będzie działać, php tylko by przeszkadzał!

 

Pozdrawiam,
Tomek
2
komentarz 5 września 2016 przez Comandeer Mentor (452,460 p.)

A ja się nie zgodzę. Konfiguracja adresów w aplikacji jest… no właśnie konfiguracją w aplikacji, nie na serwerze. Z tego powodu uważam, że routing powinien być w kodzie (co dodatkowo daje nam ten plus, że przeniesienie na inną maszynę będzie prostsze).

komentarz 5 września 2016 przez CzikaCarry Szeryf (75,440 p.)
Dzięki wielkie za odpowiedź! :)
komentarz 5 września 2016 przez Thomas Frost Bywalec (2,520 p.)
edycja 5 września 2016 przez Thomas Frost
Cześć,

​Trzeba sprostować parę rzeczy, bo Comandeer myli się w zeznaniach i strasznie namieszał.

mod_rewrite nie jest częścią aplikacji, to jest narzędzie od Apache i działa tylko i wyłącznie po stronie serwera: http://httpd.apache.org/docs/2.2/rewrite/intro.html
​Przeniesienie na inną maszynę jest tak trudne, jak skopiowanie całego folderu (wraz z .htaccessem oraz opcjonalnie konfiguracją serwera, php itd.).

​Rewrite ma związek tylko i wyłącznie z serwerem!
http://stackoverflow.com/questions/3131236/how-do-you-enable-mod-rewrite

A pracuje się na tym w ten sposób, że dla danej aplikacji dokleja się po prostu do .htaccessa kilka linijek nowych RewriteRule's zawierających regex (regular expressions) do podmiany adresów (jeszcze raz - to serwer zajmuje się podmianą adresów, nie aplikacja), warto wspomnieć, że można mieć więcej .htaccess'ów niż jeden (wystarczy, że są w różnych folderach).
 
EDIT: Ręczna podmiana adresów w index.php mija się celem i jest bez sensu, ponieważ w ten sposób można zmienić jedynie url na inny, a nie podmienić jego nazwy (tzn. tak jak to robi DNS, wpisujesz google.pl, ale tak naprawdę to jest 216.58.217.195).
 

Pozdrawiam,
Tomek
2
komentarz 5 września 2016 przez Comandeer Mentor (452,460 p.)

mod_rewrite nie jest częścią aplikacji, to jest narzędzie od Apache i działa tylko i wyłącznie po stronie serwera

A napisałem coś innego?

Napisałem, że routing jest częścią aplikacji – bo jest. Określa strukturę adresów, zatem mapowanie akcji. To nie jest część konfiguracji serwera. Częścią konfiguracji serwera jest przekierowanie adresów do engine'u aplikacji (czy tam front controllera – jak zwał tak zwał), który załatwi resztę.

Przeniesienie na inną maszynę jest tak trudne, jak skopiowanie całego folderu (wraz z .htaccessem oraz opcjonalnie konfiguracją serwera, php itd.).

Tak, ale przenieść będziesz mógł wyłącznie na maszynę z Apache'em – i to w tej samej lub nowszej wersji (bo składnia apache confa lubi być bardzo wybredna i się często zmieniać). I tak, wiem, konteneryzacja, Docker i te sprawy – ale nie oszukujmy: to overkill dla wielu prywatnych projektów. 

Rewrite ma związek tylko i wyłącznie z serwerem!

mod_rewrite – tak. Routing – nie; wręcz powinien mieć jak najmniej wspólnego z serwerem.

A pracuje się na tym w ten sposób, że dla danej aplikacji dokleja się po prostu do .htaccessa kilka linijek nowych RewriteRule's zawierających regex (regular expressions) 

Dlaczego zatem Symfony, Laravel, Slim, Silex czy choćby nawet stara Kohana używają mod_rewrite wyłącznie do przechwycenia żądań do niefizycznych lokacji? 

jeszcze raz - to serwer zajmuje się podmianą adresów, nie aplikacja

A jak serwer mi przepisze adresy jeśli jest jeden entry point do aplikacji – index.php? Będziemy się bawić z query stringiem? Rozwiązywaniem adresów aplikacji powinna zajmować się aplikacja (bo ona najlepiej wie, co dany adres ma robić). Serwer powinien jedynie jej to umożliwiać poprzez serwowanie informacji o żądanym przez usera URL-u. 

warto wspomnieć, że można mieć więcej .htaccess'ów niż jeden (wystarczy, że są w różnych folderach).

Warto wspomnieć, że taki nginx wgl nie zezwala na konfigurację poza głównymi plikami configu i powody są proste: wydajność i brak race conditions w wypadku nadpisywania ustawień w kaskadzie. Więc nie powiedziałbym, żeby wiele plików .htaccess (czy – bardziej radykalnie – sam pomysł .htaccess) było jakimś argumentem za. Co więcej, tego typu rzeczy są szczegółem implementacyjnym serwera, który prawdę mówiąc nic nie powinien obchodzić naszej aplikacji.

PS jeśli Ty mi zminusowałeś odpowiedź, to chętnie bym się dowiedział, co jest w niej niewłaściwego.

1
komentarz 5 września 2016 przez Comandeer Mentor (452,460 p.)

EDIT: Ręczna podmiana adresów w index.php mija się celem i jest bez sensu, ponieważ w ten sposób można zmienić jedynie url na inny, a nie podmienić jego nazwy (tzn. tak jak to robi DNS, wpisujesz google.pl, ale tak naprawdę to jest 216.58.217.195).

A ten argument jest całkowicie chybiony, bo routing nie polega na "podmianie adresów" tylko na mapowaniu adresu z konkretną akcją. Sam adres pozostaje nietknięty. 

komentarz 5 września 2016 przez Thomas Frost Bywalec (2,520 p.)
Cześć,

​Widzisz! I możesz się rozpisać jaśniej jak chcesz! Przyznaję rację w 99%, ten 1% pozostawiam na to, że dispatcher powinien być najlepiej osobnym plikiem a nie index.php.

Pozdrawiam,
Tomek
1
komentarz 5 września 2016 przez CzikaCarry Szeryf (75,440 p.)
Nie wiem po co te minusy, plusy, srusy, wyrzucić to wszystko w diabły! Ps. To nie ja minusiwalem, jak dla mnie obydwie odpowiedzi są na temat i w tej odpowiedzi nie powinno być -1 głosów, głosy raczej powinny być na plus. Jedna odpowiedź powiedziała o jednym sposobie, druga o drugim, jak dla mnie to obydwie powinny dostac najkę, ale jako iż nie mam takiej możliwości,to zamykam temat. Dzieki wielkie panowie za pomoc i rozjasnienie sytuacji, pozdrawiam!

Podobne pytania

0 głosów
1 odpowiedź 71 wizyt
pytanie zadane 24 lutego 2018 w PHP, Symfony, Zend przez Maniek Bywalec (2,060 p.)
0 głosów
1 odpowiedź 147 wizyt
pytanie zadane 6 grudnia 2017 w PHP, Symfony, Zend przez Alterwar Mądrala (7,280 p.)
0 głosów
0 odpowiedzi 26 wizyt
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

62,398 zapytań

108,540 odpowiedzi

226,577 komentarzy

35,631 pasjonatów

Przeglądających: 163
Pasjonatów: 5 Gości: 158

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...