Mam adres URL, który wygląda następująco:
url.com/picture.php?id=51
Jak bym się zajął konwersją tego adresu URL na:
picture.php/Some-text-goes-here/51
Myślę, że WordPress robi to samo.
Jak mam zrobić przyjazne adresy URL w PHP?
php
.htaccess
url
mod-rewrite
url-rewriting
Jazerix
źródło
źródło
mod_rewrite
to wszystko, czego potrzebujesz do tego i jest wiele pytań dotyczących tego tutaj, na SO. A jeśli „myślisz”, że wordpress robi to samo, dlaczego po prostu go nie sprawdzisz ? ;)Odpowiedzi:
Zasadniczo możesz to zrobić na dwa sposoby:
Trasa .htaccess z mod_rewrite
Dodaj plik o nazwie
.htaccess
w folderze głównym i dodaj coś takiego:To powie Apache, aby włączył mod_rewrite dla tego folderu, a jeśli zostanie poproszony o adres URL pasujący do wyrażenia regularnego, przepisuje go wewnętrznie do tego, co chcesz, bez oglądania go przez użytkownika końcowego. Łatwe, ale nieelastyczne, więc jeśli potrzebujesz więcej mocy:
Trasa PHP
Zamiast tego umieść w swoim .htaccess: (zwróć uwagę na początkowy ukośnik)
Poinstruuje to, aby uruchomić Twoje
index.php
dla wszystkich plików, których normalnie nie może znaleźć w Twojej witrynie. W tym miejscu możesz na przykład:W ten sposób robią to duże witryny i systemy CMS, ponieważ pozwala to na znacznie większą elastyczność w analizowaniu adresów URL, adresów URL zależnych od konfiguracji i bazy danych itp. Jednak w przypadku sporadycznego użycia zakodowane na stałe reguły przepisywania w programie
.htaccess
będą wystarczające.źródło
picture.php/invalid-text/51
spowoduje również przekierowanie do tej samej lokalizacji. Możesz również dodać sprawdzenie, czy ciąg jest poprawny, a jeśli nie, przekierować ponownie do właściwej lokalizacji. Tak właśnie zrobiłem to na jednej z moich witryn za pomocą htaccess./blog/25
zarówno pliki/picture/51
i/download/684
. Ponadto jest to uważane za bardzo złą praktykę (i powoduje karę za PR w Google!), Jeśli nie wszystkie losowo generowane adresy URL poprawnie zwracają 404.FallbackResource /index.php
(uwaga na wiodący slash)FallbackResource
uruchamia się tylko w przypadku plików, które w rzeczywistości nie istnieją w systemie plików, stąd rozwiązanie awaryjne . Więc jeśli masz plik/static/styles.css
i odnosisz się do niego, ponieważhttp://mydomain.tld/static/styles.css
kod nigdy nie jest wykonywany, dzięki czemu działa zgodnie z oczekiwaniami i zamierzeniami w sposób przejrzysty.if($elements[0] === NULL)
zamiast tego, ponieważ$elements
nadal zwróci liczbę jeden, nawet jeśli jest pusta.Jeśli chcesz tylko zmienić trasę,
picture.php
to dodanie reguły przepisywania w.htaccess
celu zaspokoi Twoje potrzeby, ale jeśli chcesz przepisać adres URL tak, jak w Wordpress, to PHP jest drogą. Oto prosty przykład na początek.Struktura folderów
Istnieją dwa pliki, które są potrzebne w folderze głównym,
.htaccess
aindex.php
, i dobrze byłoby, aby umieścić resztę.php
plików w osobnym folderze, npinc/
..htaccess
Ten plik ma cztery dyrektywy:
RewriteEngine
- włącz silnik przepisywaniaRewriteRule
- odmów dostępu do wszystkich plików winc/
folderze, przekieruj każde wywołanie do tego folderu doindex.php
RewriteCond
- zezwalaj na bezpośredni dostęp do wszystkich innych plików (takich jak obrazy, css lub skrypty)RewriteRule
- przekierować cokolwiek innego doindex.php
index.php
Ponieważ wszystko jest teraz przekierowywane do index.php, zostanie ustalone, czy adres URL jest poprawny, wszystkie parametry są obecne i czy typ parametrów jest poprawny.
Aby przetestować adres URL, musimy mieć zestaw reguł, a najlepszym narzędziem do tego jest wyrażenie regularne. Używając wyrażeń regularnych, zabijemy dwie muchy jednym ciosem. Adres URL, aby przejść ten test, musi mieć wszystkie wymagane parametry, które są testowane na dozwolonych znakach. Oto kilka przykładów reguł.
Następnie należy przygotować żądanie uri.
Teraz, gdy mamy żądanie uri, ostatnim krokiem jest przetestowanie uri na regułach wyrażeń regularnych.
Pomyślne dopasowanie spowoduje, że ponieważ używamy nazwanych wzorców podrzędnych w wyrażeniu regularnym, wypełni
$params
tablicę prawie tak samo, jak PHP wypełnia$_GET
tablicę. Jednak w przypadku korzystania z dynamicznego adresu URL$_GET
tablica jest wypełniana bez sprawdzania parametrów.Tych kilka wierszy kodu i podstawowa znajomość wyrażeń regularnych wystarczy, aby zacząć budować solidny system routingu.
Kompletne źródło
źródło
jest to plik .htaccess, który przekazuje prawie wszystko do index.php
to do Ciebie należy przeanalizowanie $ _SERVER ["REQUEST_URI"] i skierowanie do picture.php lub cokolwiek
źródło
FallbackResource
dyrektywę kilka głównych wersji temu, co jest teraz preferowanym sposobem implementacji tego zachowania przy niższych kosztach wydajności, ponieważ nie wymaga uruchamiania całego silnika przepisywania. Dokumentacja tutaj . Twoje reguły są również wadliwe, ponieważ nie odwołujesz się do katalogów (!-d
), a wszystkie filtry rozszerzeń są przestarzałe --f
powinny już je wychwycić.PHP nie jest tym, czego szukasz, sprawdź mod_rewrite
źródło
Chociaż już udzielono odpowiedzi, a intencją autora jest stworzenie aplikacji typu kontrolera frontowego, ale publikuję dosłowną regułę dla zadanego problemu. jeśli ktoś ma problem za to samo.
Powyższe powinno działać dla url
picture.php/Some-text-goes-here/51
. bez używania pliku index.php jako aplikacji przekierowującej.źródło