Przyjazne linki w PHP-Fusion v7

mod_rewriteZastanawialiście się kiedyś, czy w PHP-Fusion można zastosować mod_rewrite? Odpowiedź brzmi: tak. Można to zrobić bardzo łatwo i szybko. Przedstawiony sposób nie jest idealny, ponieważ lepiej byłoby, gdyby wyświetlała się np. nazwa newsa, czy strony. Jednakże warto jest to uczynić, ponieważ adresy do poszczególnych stron są łatwiejsze do zapamiętania (zamiast np. article.php?article_id=1 to Czytaj-art-1.html) i w pewnym stopniu pomaga to wyszukiwarkom rozpoznanie treści.

No to do dzieła! Cały proces zapisany jest w poniższych punktach.

  1. W głównym katalogu strony tworzymy plik o nazwie .htaccess i zawartości:
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/(.*)$
    RewriteRule ^Art\.html$ articles.php [N]
    RewriteRule ^Art-kat-([0-9]+)\.html$ articles.php?cat_id=$1 [L]
    RewriteRule ^Czytaj-art-([0-9]+)\.html$ readarticle.php?article_id=$1 [L]
    RewriteRule ^Home\.html$ index.php [N]
    RewriteRule ^Pliki\.html$ downloads.php [N]
    RewriteRule ^FAQ\.html$ faq.php [N]
    RewriteRule ^Linki\.html$ weblinks.php [N]
    RewriteRule ^Kategorie-newsow\.html$ news_cats.php [N]
    RewriteRule ^News\.html$ news.php [N]
    RewriteRule ^Czytaj-news-([0-9]+)\.html$ news.php?readmore=$1 [L]
    RewriteRule ^Kontakt\.html$ contact.php [N]
    RewriteRule ^Galeria\.html$ photogallery.php [N]
    RewriteRule ^Przeszukaj-forum\.html$ search.php?stype=f [N]
    RewriteRule ^Szukaj\.html$ search.php [N]
    RewriteRule ^Profil-([0-9]+)\.html$ profile.php?lookup=$1 [L]
    RewriteRule ^Galeria-album-([0-9]+)\.html$ photogallery.php?album_id=$1 [L]
    RewriteRule ^Galeria-foto-([0-9]+)\.html$ photogallery.php?photo_id=$1 [L]
    RewriteRule ^Galeria-foto-powieksz-([0-9]+)\.html$ showphoto.php?photo_id=$1 [L]
    RewriteRule ^Pliki-kategoria-([0-9]+)\.html$ downloads.php?cat_id=$1 [L]
    RewriteRule ^Pliki-kategoria-([0-9]+)-pobierz-([0-9]+)\.html$ downloads.php?cat_id=$1&download_id=$2 [L]
    RewriteRule ^FAQ-kategoria-([0-9]+)\.html$ faq.php?cat_id=$1 [L]
    RewriteRule ^Linki-kategoria-([0-9]+)\.html$ weblinks.php?cat_id=$1 [L]
    RewriteRule ^Linki-kategoria-([0-9]+)-zobacz-strone-([0-9]+)\.html$ weblinks.php?cat_id=$1&weblink_id=$2 [L]
    RewriteRule ^Przygotowanie-do-druku-newsa-([0-9]+)\.html$ print.php?type=N&item_id=$1 [L]
    RewriteRule ^Przygotowanie-do-druku-arta-([0-9]+)\.html$ print.php?type=A&item_id=$1 [L]
    RewriteRule ^Rejestracja\.html$ register.php [N]
    RewriteRule ^Przypomnienie-hasla\.html$ lostpassword.php [N]
  2. Otwieramy folder forum/ i również tworzymy w nim plik o nazwie .htaccess, ale o zawartości takiej:
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/forum/(.*)$
    RewriteRule ^Forum\.html$ forum/index.php [L]
    RewriteRule ^Zobacz-forum-([0-9]+)\.html$ forum/viewforum.php?forum_id=$1 [L]
    RewriteRule ^Zobacz-forum-([0-9]+)-temat-([0-9]+)\.html$ forum/viewthread.php?forum_id=$1&thread_id=$2 [L]
    RewriteRule ^Zobacz-cz-([0-9]+)-forum-([0-9]+)-temat-([0-9]+)\.html$ forum/viewthread.php?rowstart=$1&forum_id=$2&thread_id=$3 [L]
    RewriteRule ^Zobacz-forum-([0-9]+)-temat-([0-9]+)-post-([0-9]+)\.html$ forum/viewthread.php?forum_id=$1&thread_id=$2&pid=$3 [L]
    RewriteRule ^Zobacz-forum-([0-9]+)-temat-([0-9]+)-cz-([0-9]+)\.html$ forum/viewthread.php?forum_id=$1&thread_id=$2&rowstart=$3 [L]
    RewriteRule ^edytuj-forum-([0-9]+)-temat-([0-9]+)-post-([0-9]+)\.html$ forum/post.php?action=edit&forum_id=$1&thread_id=$2&post_id=$3 [L]
    RewriteRule ^odp-forum-([0-9]+)-temat-([0-9]+)\.html$ forum/post.php?action=reply&forum_id=$1&thread_id=$2 [L]
    RewriteRule ^odp-forum-([0-9]+)-temat-([0-9]+)-post-([0-9]+)-cyt-([0-9]+)\.html$ forum/post.php?action=reply&forum_id=$1&thread_id=$2&post_id=$3&quote=$4 [L]
    RewriteRule ^nowy-temat-forum-([0-9]+)\.html$ forum/post.php?action=newthread&forum_id=$1 [L]
  3. Logujemy się na naszej stronie, wchodzimy w Panel Administratora, zarządzanie stroną, zarządzanie panelami, klikamy „Dodaj nowy panel” i w treści wpisujemy następujący kod PHP:
    function friendly_url($buf) {
    if(!substr_count($_SERVER['REQUEST_URI'],"administration")){
    $buf = preg_replace('#readarticle\.php\?article_id=([0-9]*?)(\'|")#si', 'Czytaj-art-\1.html\2', $buf);
    $buf = preg_replace('#articles\.php\?cat_id=([0-9]*?)(\'|")#si', 'Art-kat-\1.html\2', $buf);
    $buf = preg_replace('#articles\.php#si', 'Art.html', $buf);
    $buf = preg_replace('#downloads\.php\?cat_id=([0-9]*?)(\'|")#si', 'Pliki-kategoria-\1.html\2', $buf);
    $buf = preg_replace('#downloads\.php\?cat_id=([0-9]*?)(&|&)download_id=([0-9]*?)(\'|")#si', 'Pliki-kategoria-\1-pobierz-\3.html\4', $buf);
    $buf = preg_replace('#downloads\.php#si', 'Pliki.html', $buf);
    $buf = preg_replace('#faq\.php\?cat_id=([0-9]*?)(\'|")#si', 'FAQ-kategoria-\1.html\2', $buf);
    $buf = preg_replace('#faq\.php#si', 'FAQ.html', $buf);
    $buf = preg_replace('#forum/index\.php#si', 'forum/Forum.html', $buf);
    $buf = preg_replace('#viewforum\.php\?forum_id=([0-9]*?)(\'|")#si', 'Zobacz-forum-\1.html\2', $buf);
    $buf = preg_replace('#viewthread\.php\?forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(\'|")#si', 'Zobacz-forum-\1-temat-\3.html\4', $buf);
    $buf = preg_replace('#viewthread\.php\?rowstart=([0-9]*?)(&|&)forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(\'|")#si', 'Zobacz-cz-\1-forum-\3-temat-\5.html\6', $buf);
    $buf = preg_replace('#viewthread\.php\?forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(&|&)pid=([0-9]*?)\#post_([0-9]*?)(\'|")#si', 'Zobacz-forum-\1-temat-\3-post-\5.html#post_\6\7', $buf);
    $buf = preg_replace('#post\.php\?action=newthread(&|&)forum_id=([0-9]*?)(\'|")#si', 'nowy-temat-forum-\2.html\3', $buf);
    $buf = preg_replace('#viewthread\.php\?forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(&|&)rowstart=([0-9]*?)(\'|")#si', 'Zobacz-forum-\1-temat-\3-cz-\5.html\6', $buf);
    $buf = preg_replace('#post\.php\?action=edit(&|&)forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(&|&)post_id=([0-9]*?)(\'|")#si', 'edytuj-forum-\2-temat-\4-post-\6.html\7', $buf);
    $buf = preg_replace('#post\.php\?action=reply(&|&)forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(\'|")#si', 'odp-forum-\2-temat-\4.html\5', $buf);
    $buf = preg_replace('#post\.php\?action=reply(&|&)forum_id=([0-9]*?)(&|&)thread_id=([0-9]*?)(&|&)post_id=([0-9]*?)(&|&)quote=([0-9]*?)(\'|")#si', 'odp-forum-\2-temat-\4-post-\6-cyt-\8.html\9', $buf);
    $buf = preg_replace('#weblinks\.php\?cat_id=([0-9]*?)(\'|")#si', 'Linki-kategoria-\1.html\2', $buf);
    $buf = preg_replace('#weblinks\.php\?cat_id=([0-9]*?)(&|&)weblink_id=([0-9]*?)(\'|")#si', 'Linki-kategoria-\1-zobacz-strone-\3.html\4', $buf);
    $buf = preg_replace('#weblinks\.php#si', 'Linki.html', $buf);
    $buf = preg_replace('#news_cats\.php#si', 'Kategorie-newsow.html', $buf);
    $buf = preg_replace('#news\.php\?readmore=([0-9]*?)(\'|")#si', 'Czytaj-news-\1.html\2', $buf);
    $buf = preg_replace('#contact\.php#si', 'Kontakt.html', $buf);
    $buf = preg_replace('#photogallery\.php\?album_id=([0-9]*?)(\'|")#si', 'Galeria-album-\1.html\2', $buf);
    $buf = preg_replace('#photogallery\.php\?photo_id=([0-9]*?)(\'|")#si', 'Galeria-foto-\1.html\2', $buf);
    $buf = preg_replace('#showphoto\.php\?photo_id=([0-9]*?)(\'|")#si', 'Galeria-foto-powieksz-\1.html\2', $buf);
    $buf = preg_replace('#photogallery\.php#si', 'Galeria.html', $buf);
    $buf = preg_replace('#search\.php\?stype=f#si', 'Przeszukaj-forum.html', $buf);
    $buf = preg_replace('#search\.php#si', 'Szukaj.html', $buf);
    $buf = preg_replace('#profile\.php\?lookup=([0-9]*?)(\'|")#si', 'Profil-\1.html\2', $buf);
    $buf = preg_replace('#print\.php\?type=N(&|&)item_id=([0-9]*?)(\'|")#si', 'Przygotowanie-do-druku-newsa-\2.html\3', $buf);
    $buf = preg_replace('#print\.php\?type=A(&|&)item_id=([0-9]*?)(\'|")#si', 'Przygotowanie-do-druku-arta-\2.html\3', $buf);
    if(!substr_count($_SERVER['REQUEST_URI'],"forum")) $buf = preg_replace('#index\.php#si', 'Home.html', $buf);
    $buf = preg_replace('#register\.php#si', 'Rejestracja.html', $buf);
    $buf = preg_replace('#lostpassword\.php#si', 'Przypomnienie-hasla.html', $buf);
    $buf = preg_replace('#ion/Home\.html#si', 'ion/index.php', $buf);
    }
    return $buf;
    }
    add_handler("friendly_url");

    Zapisujemy i włączamy panel (nie będzie on widoczny na stronie).

Kod zaczerpnięty z forum PHP-Fusion. Autor: SlawekNeo.

6 Komentarzy »

  1. Domon mówi:

    Za dużo się nie narobiłeś, sklepałeś tylko w punkty :P .
    Linki typu: news-1.html to według mnie żadne przyjazne linki najlepiej jest tak jak ma WordPress
    np.
    blog-lisu.eu/2009/07/19/przyjazne-linki-w-php-fusion-v7/
    Taki link sprawi że pod odpowiednim pytaniem google od razu znajdzie naszą stronę:
    http://www.google.pl/search?q=Przyjazne+linki+w+PHP-Fusion+v7&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:pl:official&client=firefox-a

    comment-bottom
  2. Lisu mówi:

    No to napisałem, że w takiej postaci niewiele dają te linki, ale innnej opcji do PF obecnie nie znalazłem (nie wymagającej edycji plików). Na forum PHP-Fusion są wzmianki o Furl2, ale Slawekneo jeszcze nie wrzucił tego.

    Ta modyfikacja dobra jest jedynie na pojedyńcze podstrony np. redakcja itp.

    Co do mojej roboty to przeszukałem wszystkie tematy na forum na ten temat :P

    comment-bottom
  3. Domon mówi:

    Jest jakiś temat chyba jak zrobić newsy, arty albo userów tak żeby wyświetlało ich nazwę… Ale dokładnie sam nie pamiętam jak to szło ;]

    comment-bottom
  4. Lisu mówi:

    Bo jest ten Furl 2 w wersji beta, która zresztą na pf7 nie chce mi działać.

    comment-bottom
  5. LukasAMD mówi:

    Dodanie naprawdę przyjaznych linków do fusiona to żaden problem :D
    Sposób opisany wyżej może ułatwić indeksację, ale nie przekazuje słów kluczowych, więc za dobry nie jest.

    Poza tym warto zastanowić się nad wydajnością. Cała kod naszej wygenerowanej strony jest poddawany kilkanaście razy wyszukiwaniu i podmianie przy użyciu preg_replace. Samo szukanie nieźle spowalnia, a tu dochodzi jeszcze dopasowanie do wyrażeń regularnych + podmiana. IMO przy nawet średnim ruchu, może to mieć fatalne skutki na serwer.

    Nie żebym się reklamował, ale moja metoda nie robi choćby jednego dodatkowe zapytania do bazy :D No chyba że zdecydujemy się na wariant bez duplikatów, bo jak wiadomo link:

    adres-strony.pl/news12/to-jest-przykladowy-news/

    w większości wypadków działa również jako:

    adres-strony.pl/news12/bezesneowny-tekst/

    No i w efekcie mamy duplicate content na stronie, jeżeli ktoś poda zmieniony link. W wypadku metody bez duplikatów („zero duplicate”), problem nie występuje: jeżeli link jest nieprawidłowy, następuje automatyczne przekierowanie stałe na postać poprawną.

    comment-bottom
  6. Lisu mówi:

    Masz rację Lukas. Dałem to, co znalazłem i było proste dla przeciętnego usera. Jak będę robił stronę w fusionie to w sprawie przyjaznych linków zgłoszę się do Ciebie.

    comment-bottom

RSS z komentarzami do tego posta. TrackBack URL

Zostaw komentarz