Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozbudowany mod_rewrite
Forum PHP.pl > Forum > PHP
soomal
Piszę moduł do przyjaznych linków w oscommerce2 i zabija mnie ilość reguł rewrite w .htaccess, przez chaos w linkach na stronie (raz przekazywana nazwa kategorii, innym razem nie) muszę uwzglęniać każdą opcję.
Nie posiadam dużej wiedzy o regexp, więc jeśli te reguły można jakoś zoptymalizować to proszę o radę.
Np. taka nazwa produktu w pierwszej linii (.*?). Czy można zrobić w tym jakiegoś ifa (jeśli jest to przekaż nazwę do ?_cname_, a jak nie ma to olej).
Załączam fragment reguł. Aktualnie, żeby to dało się jakoś ogarnąć piszę sobię automat, którym mógłbym ogarnąć każdą permutację tych wartości, ale pytam czy nie ma prostszej drogi.
Fragment .htaccess:
  1. <?php
  2. RewriteRule ^kategoria/([0-9_]+)/produkt/([0-9_]+)/(.*?)/strona/([0-9]+)/na_strone/([0-9]+)$
  3. index.php?cPath=$1&products_id=$2&_pname_=$3&page=$4&prds_per_site=$5
  4. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9_]+)/(.*?)/strona/([0-9]+)$
  5. index.php?cPath=$1&_pname_=$2&page=$3&_pname_=$4
  6. RewriteRule ^kategoria/([0-9_]+)/produkt/([0-9_]+)/(.*?)/na_strone/([0-9]+)?$
  7. index.php?cPath=$1&_pname_=$2&prds_per_site=$3
  8. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9]+)/(.*)/typ/([0-9]+)/dodaj_do_koszyka$
  9. index.php?cPath=$1&products_id=$2&_pname_=$3&product_type=$4&action=buy_now
  10. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9]+)/typ/([0-9]+)/dodaj_do_koszyka$
  11. index.php?cPath=$1&products_id=$2&product_type=$3&action=buy_now
  12. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9]+)/(.*)/typ/([0-9]+)$
  13. index.php?cPath=$1&products_id=$2&_pname_=$3&product_type=$4
  14. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9]+)/typ/([0-9]+)$
  15. index.php?cPath=$1&products_id=$2&product_type=$3
  16. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9]+)/(.*)/kup$
  17. product_info.php?cPath=$1&products_id=$2&_pname_=$3&action=buy_now
  18. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9]+)/(.*)$
  19. index.php?cPath=$1&products_id=$2&_pname_=$3
  20. RewriteRule ^kategoria/([0-9]+)/produkt/([0-9_]+)$
  21. index.php?cPath=$1&products_id=$2
  22. ?>
Louner
Do .htaccess możesz wstawić taki wpis ( i tylko taki winksmiley.jpg, przepuszcza małe i wielkie litery alfabetu, cyfry, znak równości i podkreślenia ):
Kod
RewriteRule ^(/[_-a-zA-Z0-9=^\/]+)$ index.php?param=$1 [L]


Wszystko przejdzie do zmiennej $_GET['param']; Potem wystarczy w index.php załączyć kod php podobny do tego:

  1. <?php
  2. if( isset($_GET['param']) ) {
  3.    $fetch = explode('/',$_GET['param']);
  4.    $_PARAM = array();
  5.            
  6.    for( $i = 1; $i < count($fetch); $i += 2 ) {
  7.        @$_PARAM[$fetch[$i]] = $fetch[$i+1];
  8.    }
  9. }
  10. ?>


i ostatecznie w tablicy $_PARAM przy adresie:
/kategoria/5/produkt/6
otrzymasz:
  1. <?php
  2. $_PARAM['kategoria'] = 5;
  3. $_PARAM['produkt'] = 6;
  4. ?>


I tyle. smile.gif Chodzi o to, żeby cały adres przekazać do PHP i tam go przerabiać, a nie rozdrabniać się na wszystkie przypadki w .htaccess

Pozdrawiam

@soomal
Nie ma problemu. winksmiley.jpg
soomal
Dzięki za to rozwiązanie.
cojack
Przykład z drupala:
Kod
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

Reszta tak jak Louner napisał.

Można też troszkę inaczej, ale każdy jak tam lubi.
soomal
Zapomniałem o jednej rzeczy. Po przepisaniu adresu w index.php potrzebuje przekierowania na konkretną stronę, ale tak, żeby adres w pasku nie zmienił się. Jak to uzyskać?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.