Jeżeli nie uzywasz frameworka to będzie trzeba trochę zaczarować. Od razu zaznaczam, że nie jestem mistrzem konfiguracji nginx/apache, ale takie proste rozwiązanie nas urządza. A więc do dzieła:
- Musimy dodać odpowiednią regułę, która przepisze nasz url.
Dla nginxa:
location ~ ^/filmy/(?<slug>.+) {
try_files $uri $uri/ /movies.php?slug=$slug;
}
Dla apacha (chyba, bo nie sprawdzałem):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/filmy/(.+)$ /movies.php?slug=$1 [L]
To spowoduje, że jak ktoś wejdzie pod taki link: aplikacja.dev/filmy/wladca-pierscieni-peter-jackson-2001-12 to odpali się plik movies.php
. Nie bardzo umiem zrobić regex, który zmatchuje slug, dlatego dodałem przedrostek filmy
, ale można by się pokusić o coś takiego:
RewriteRule ^/([a-z0-9]+(?:-[a-z0-9]+)*)$ /movies.php?slug=$1 [L]
To by pozwoliło przekierować taki url aplikacja.dev/wladca-pierscieni-peter-jackson-2001-12 na movies.php
, ale to już musisz sam podłubać, bo ja nie mam czasu. Z tym, że chyba nie działa bo apach i nginx mają jakiś inny standard regex niż ten mi znany.
- Tworzysz plik
movies.php
.
<?php
// dzięki przepisaniu urla na movies.php?slug=$1 masz w $_GET slug
$slug = $_GET["slug"];
- Wyciągasz film po slugu
SELECT * FROM movies WHERE slug = :slug
- Wyświetlasz dane filmu.
Jeżeli chcesz stworzyć link do tego, to np tak:
$movies = [
["name" => "Władca Pierścieni", "slug" => "wladca-pierscieni-peter-jackson-2001-12"],
["name" => "Foo bar", "slug" => "foo-bar-john-doe-2012-03"],
];
foreach ($movies as $movie) {
echo '<a href="/filmy/' . $movie["slug"] . '">' . $movie["name"] . '</a>';
}
Generalnie użycie frameworka bardzo by Ci tu ułatwiło życie. Taki laravel to w zasadzie zrobi wszystkio za Ciebie. Nie będziesz musiał się bawić z konfiguracją serwera, bo wewnętrzy system routingu i front controller pattern wszystko ogarnie. Nawet jak go odpowiednio skonfigurujesz, co jest banalne, to Ci po slugu sam wyciągnie film z bazy, a jak mu się nie uda to przekieruje na 404 - confused travolta
.