Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: .htaccess problem 2 zbieżnych reguł ..
Forum PHP.pl > Forum > PHP
radziu
Witam kolegów smile.gif
Mam drobny kłopot i pomimo starań i prób nie udało mi się zamemu tego zrobić, mianowicie:


Mam 2 reguły przepisywania linków i chciałbym aby obie działały, ale nie potrafię sobie z tym poradzić:

--
RewriteEngine on


RewriteRule ^(.*)/([0-9]+)/(.*)\.html$ /auto.php?id=$2&uri=$3 [QSA,L]
RewriteRule ^(.*)/([0-9]+)/(.*)\.html$ /strona.php?id=$2&uri=$3 [QSA,L]

--
W powyższej konfiguracji działa tylko pierwsza reguła, a kiedy ją zachaschuje działa druga sad.gif
Czy da sie to jakoś to przepisać, aby się nie gryzło ?
Pozdrawiam i z góry dzięki za podpowiedź lub wskazówkę wink.gif
ShadowD
A z której strony skrypt ma wiedzieć jakiej reguły ma użyć? Masz 2 reguły które mają takie same wymagania i kompilator nagle nie zacznie czytać Ci w myślach i robić tego co zechcesz...

Jeśli zaś chodzi Ci by kod nagle przekierował na raz na dwa adresy to też się nie da, nie ma opcji by podzielić użytkownika na pół. haha.gif

Rozwiązaniem jest rozróżnienie wyrażeń regularnych tak by jednoznacznie definiowały gdzie przekierować.
radziu
No to mi kolega pomógł.... :]
Jakoś tak słabo u mnie z rozróżnianiem wyrażeń regularnych, więc może w inny sposób podejdźmy do tego tematu.

W moim systemie, funkcja generująca url'a dla modułu 'static_pages' (dla reguły "/strona.php?m=pages&id=") wygląda tak:

func.php


  1.  
  2. $meta_title = htmlspecialchars(trim($_POST['meta_title']));
  3. $meta_desc = htmlspecialchars(trim($_POST['meta_desc']));
  4. $meta_keyw = htmlspecialchars(trim($_POST['meta_keyw']));
  5.  
  6. $znaki1 = array('ę','ó','ą','ś','ł','ż','ź','ć','ń','Ę','Ó','Ą','Ś','Ł','Ż','Ź','Ć','Ń');
  7. $znaki2 = array('e','o','a','s','l','z','z','c','n','e','o','a','s','l','z','z','c','n');
  8. $uri = strtolower ( str_replace ($znaki1, $znaki2, $meta_title) );
  9. $uri = preg_replace ('@[^a-z0-9]+@','-',$uri);
  10.  
  11. $r_uri = mysql_query("SELECT * FROM static_pages WHERE uri = '$uri' AND id<>'$id' LIMIT 1");
  12. if ( mysql_num_rows ( $r_uri ) ) {
  13. $i = 1;
  14. while ( mysql_num_rows ( $r_uri ) ) {
  15. $new_uri = $uri.$i++;
  16. $r_uri = mysql_query("SELECT * FROM static_pages WHERE uri = '$new_uri' AND id<>'$id' LIMIT 1");
  17. }
  18. $uri = $new_uri;
  19. }
  20.  


Natomiast w <head> pobieram sobie meta w taki sposób:

  1.  
  2. <?php
  3.  
  4. $static_title = ' - static title';
  5.  
  6. // tytuł, opis i słowa kluczowe dla innych podstron niż podstrona samochodu (auto.php?id=)
  7. $default_title = 'default tittle';
  8. $default_desc = ' default description';
  9. $default_keyw = 'default keywords';
  10.  
  11.  
  12.  
  13. if ( isset ( $_GET['uri'] ) ) {
  14. $uri = addslashes(strip_tags(trim($_GET['uri'])));
  15. $id = (int)$_GET['id'];
  16. myconnect();
  17. $r_meta = mysql_query ("SELECT id,meta_title,meta_desc,meta_keyw FROM static_pages WHERE (id='$id') ");
  18. $meta_tags = mysql_fetch_assoc ( $r_meta );
  19. myclose();
  20. $_GET['id'] = $meta_tags['id'];
  21.  
  22. $meta_keyw = $meta_tags['meta_keyw'];
  23. $meta_desc = $meta_tags['meta_desc'];
  24. $meta_title = $meta_tags['meta_title'].$static_title;
  25. }
  26. else {
  27. $meta_keyw = $default_keyw;
  28. $meta_desc = $default_desc;
  29. $meta_title = $default_title;
  30. }
  31.  
  32.  
  33. ?>
  34. <html>
  35. <head>
  36. <base href="/" />
  37. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  38. <title><?php print $meta_title; ?></title>
  39. <meta name="keywords" content="<?php print $meta_keyw; ?>" />
  40. <meta name="Description" content="<?php print $meta_desc; ?>" />
  41.  



I na koniec, w stopce wyświetlam kolumnę ze stronami statycznymi:

  1. <?php
  2. myconnect();
  3. $res = mysql_query("SELECT * FROM static_pages ORDER BY id ") or die('Zapytanie niepowiodlo sie: ' . mysql_error());
  4. $i=1;
  5. while ($static_pages = mysql_fetch_assoc($res)) {
  6. ?>
  7. <?php $link= 'informacje/'.$static_pages['id'].'/'.$static_pages['page_title'].'/'. $static_pages['uri'];?>
  8. <?php
  9. $link=str_replace(' ','-',$link);
  10. ?>
  11. <ul>
  12. <li><a href=" <?php echo $link; ?>.html "><?php echo $static_pages["page_title"]; ?></a></li>
  13. </ul>
  14. <?php
  15. $i++;
  16. }
  17. myclose();
  18. ?>
  19.  


No i dobrze, być może pojawia się tu problem w tym, że dokładnie te same funkcje próbują wygenerować ten sam efekt w stosunku do modułu 'cars' (/auto.php?id=).

func.php

  1.  
  2. myconnect();
  3.  
  4. /*
  5.   **
  6.   ** pobieranie meta-tagów i..
  7.   ** utworzenie na podstawie tytułu zmiennej $uri czyli "linku"
  8.   ** który będzie używany w "seo linkach" w .htaccess
  9.   ** następnie dodaję powyższe parametry ($meta_title, $meta_desc, $meta_keyw, $uri)
  10.   ** przy wywołaniu poniższej funkcji myedit_cars()
  11.   */
  12.  
  13. $meta_title = htmlspecialchars(trim($_POST['meta_title']));
  14. $meta_desc = htmlspecialchars(trim($_POST['meta_desc']));
  15. $meta_keyw = htmlspecialchars(trim($_POST['meta_keyw']));
  16.  
  17. $znaki1 = array('ę','ó','ą','ś','ł','ż','ź','ć','ń','Ę','Ó','Ą','Ś','Ł','Ż','Ź','Ć','Ń');
  18. $znaki2 = array('e','o','a','s','l','z','z','c','n','e','o','a','s','l','z','z','c','n');
  19. $uri = strtolower ( str_replace ($znaki1, $znaki2, $meta_title) );
  20. $uri = preg_replace ('@[^a-z0-9]+@','-',$uri);
  21.  
  22. $r_uri = mysql_query("SELECT * FROM cars WHERE uri = '$uri' AND id<>'$id' LIMIT 1");
  23. if ( mysql_num_rows ( $r_uri ) ) {
  24. $i = 1;
  25. while ( mysql_num_rows ( $r_uri ) ) {
  26. $new_uri = $uri.$i++;
  27. $r_uri = mysql_query("SELECT * FROM cars WHERE uri = '$new_uri' AND id<>'$id' LIMIT 1");
  28. }
  29. $uri = $new_uri;
  30. }


head.php

  1.  
  2. <?php
  3. include("inc/func.php");
  4. ?>
  5. <!DOCTYPE HTML>
  6. <?php
  7. /*
  8.   **
  9.   ** tworzę zmienną $static_title i używam jej w meta-tagu title
  10.   **
  11.   */
  12.  
  13.  
  14.  
  15.  
  16.  
  17. // dopisek do tytułu na podstronach samochodu
  18. $static_title = ' - static tittle';
  19.  
  20. // tytuł, opis i słowa kluczowe dla innych podstron niż podstrona samochodu
  21. $default_title = 'default tittle';
  22. $default_desc = 'default description';
  23. $default_keyw = 'default keywords';
  24.  
  25.  
  26.  
  27. if ( isset ( $_GET['uri'] ) ) {
  28. $uri = addslashes(strip_tags(trim($_GET['uri'])));
  29. $id = (int)$_GET['id'];
  30. myconnect();
  31. $r_meta = mysql_query ("SELECT id,meta_title,meta_desc,meta_keyw FROM cars WHERE (id='$id') ");
  32. $meta_tags = mysql_fetch_assoc ( $r_meta );
  33. myclose();
  34. $_GET['id'] = $meta_tags['id'];
  35.  
  36. $meta_keyw = $meta_tags['meta_keyw'];
  37. $meta_desc = $meta_tags['meta_desc'];
  38. $meta_title = $meta_tags['meta_title'].$static_title;
  39. }
  40. else {
  41. $meta_keyw = $default_keyw;
  42. $meta_desc = $default_desc;
  43. $meta_title = $default_title;
  44. }
  45.  
  46. ?>
  47. <html>
  48. <head>
  49. <base href="/" />
  50. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  51. <title><?php print $meta_title; ?></title>
  52. <meta name="keywords" content="<?php print $meta_keyw; ?>" />
  53. <meta name="Description" content="<?php print $meta_desc; ?>" />





Poległem, bo nie bardzo wiem jak połączyć te 2 wątki, tak aby nie kolidowały ze sobą..
Pomoże któryś z bardziej doświadczonych kolegów ?

...i brak odzewu :]
ShadowD
Nie możesz napisać co chcesz uzyskać i jakie już linki masz? Na prawdę nie chcę mi się tego przeglądać i jeśli liczysz na pomoc to chociaż zawalcz trochę a nie czekasz na gotowca! Nie mam też pojęcia co jeden problem ma z drugim i o co tak na prawdę Ci chodzi...
kiler129
http://rtfm.killfile.pl/#cel
irmidjusz
Radziu, najwyraźniej nie zrozumiałeś, co Ci ShadowD napisał.

Cytat(radziu @ 4.08.2012, 02:55:16 ) *
RewriteRule ^(.*)/([0-9]+)/(.*)\.html$ /auto.php?id=$2&uri=$3 [QSA,L]
RewriteRule ^(.*)/([0-9]+)/(.*)\.html$ /strona.php?id=$2&uri=$3 [QSA,L]


Problem w tym, że obie reguły rozpoznające wzorzec są identyczne (^(.*)/([0-9]+)/(.*)\.html$), czyli niczym się nie różnią, czyli pasują do tych samych danych, czyli zostanie dopasowana reguła pierwsza napotkana z tych dwóch, a druga nigdy. To oznacza, że masz spartolone reguły routingu i nikt Ci nic nie poradzi, tylko sam możesz sobie poradzić, zmieniając generowane linki tak, aby się od siebie różniły tak, aby można było jedną z powyższych reguł zmienić tak, aby jednoznacznie odróżniała się od drugiej (i wszystkich pozostałych, czyli żeby była unikatowa) smile.gif
radziu
Dzięki kolegom za zainteresowanie tematem.
Jak widzicie, moja wiedza na temat php dość mocno kuleje :]

Spróbuję przepisać i zmienić funkcję generującą linki do static_pages i zmienię regułę RewriteRule ^(.*)/([0-9]+)/(.*)\.html$ /strona.php?id=$2&uri=$3 [QSA,L].
Jeśli nadal nie będę mógł sobie z tym poradzić to poproszę o pomoc, albo się poddam wink.gif

Dzięki za wskazówki wink.gif
R.
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.