Wątek przeniesiony 2022-09-12 12:30 z Webmastering przez Riddle.

RewriteRule - krótkie linki

0
RewriteEngine On
 
RewriteRule ^produkt/(.*)$ index.php?produkt=$1 [L]

RewriteRule ^kategoria/(.*)$ index.php?kategoria=$1 [L]
RewriteRule ^kategoria/(.*)/strona/(.*)$ index.php?kategoria=$1&strona=$2 [L]

RewriteRule ^kategoria/(.*)$/podkategoria/(.*)$ index.php?kategoria=$1&undercategory=$2 [L]
RewriteRule ^kategoria/(.*)$/podkategoria/(.*)$/strona/(.*)$ index.php?kategoria=$1&podkategoria=$2&strona=$3 [L]

Moi drodzy, coś robię źle - w przypadku gdy mamy jeden GET to krótkie linki działają ale już na przykład jak chcę wyświetlić kategorie i podkategorie to już nie działa, a ze strony php jest prawidłowo bo (przykład) index.php?kategoria=przyklad&podkategoria=przyklad wtedy wyświetla prawidłowo

1

Nie pamiętam za dużo z RewriteRule poza tym że to była katorga i nie pamiętam czy tam były pełnoprawne regexy, ale jeśli tak to problemem może być z zachłannością (.*), zrób z tego leniwe wyrażenie przez dodanie znaku zapytania: (.*?), lub odwróć kolejność reguł - najpierw sprawdzaj te bardziej konkretne (z podkategoriami) i pod nimi pisz te mniej sprecyzowane.

A w ogóle to z RewriteRule się męczyłem tylko na początku, o ile pisanie prostych reguł było w miarę ok, to jeśli chciało się połączyć kilka reguł które tworzyły cykle to już było to skomplikowane i nie dało się debugować. Później po prostu robiłem przekierowanie wszystkiego na jeden skrypt php który robił mapowanie - dużo prostsze w pisaniu, obsłudze, debugowaniu.

// edit: zauważyłem że masz jakieś przypadkowe $ w środku wyrażeń. $ oznacza koniec dopasowania, usuń te ze środka

1

Wydaje mi się, że powinno to wyglądać następująco:

RewriteEngine On

RewriteRule ^kategoria/(.*)/podkategoria/(.*)/strona/(.*)$ index.php?kategoria=$1&podkategoria=$2&strona=$3 [L]
RewriteRule ^kategoria/(.*)/podkategoria/(.*) index.php?kategoria=$1&undercategory=$2 [L]
RewriteRule ^kategoria/(.*)/strona/(.*)$ index.php?kategoria=$1&strona=$2 [L]
RewriteRule ^kategoria/(.*)$ index.php?kategoria=$1 [L]
RewriteRule ^produkt/(.*)$ index.php?produkt=$1 [L]

Nie działało Ci ponieważ ciąg /kategoria/opony/podkategoria/zimowe także załapuje się na regułę RewriteRule ^kategoria/(.*)$ index.php?kategoria=$1 [L], którą miałeś na początku.
Literka [L] oznacza, że .htaccess przerywa dalsze przetwarzanie. Skoro złapał się na warunek pierwszy to się złapał i kończy...
Poza tym miałeś źle zdefiniowane parametry. Podejrzewam, że chcesz mieć zamiast (.) -> (.*) a znak $ oznacza "koniec urla".

Nie wiem jak dużo masz różnych wariantów ale w Twoim przypadku musisz przemyśleć kolejność reguł w .htaccess w taki sposób aby wiersze wcześniejsze nie były prawidłowymi warunkami dla wierszy, które masz niżej.

screenshot-20220728175308.png

screenshot-20220728175453.png
screenshot-20220728180125.png

Do testów użyłem skryptu index.php:

<?php
  $req = print_r ( $_REQUEST,1 ) ;    
  echo "<html>
  <body>
    Input parameters:<hr>
    <pre>{$req}</pre>
  </body>
  </html>
  ";
0

mój cały plik

Options +FollowSymLinks
RewriteEngine On
 
RewriteRule ^software/(.+)$ index.php?software=$1                                                              **<- DZIAŁA**
RewriteRule ^software/(.+)/page/([0-9]+)$ index.php?software=$1&page=$2                       **<- NIE DZIAŁA**

RewriteRule ^extension/(.+)$ index.php?extension=$1                                                           **<- DZIAŁA**
RewriteRule ^extension/(.+)/page/([0-9]+)$ index.php?extension=$1&page=$2                    **<- NIE DZIAŁA**

RewriteRule ^search/(.+)$ index.php?search=$1                                                          **<- DZIAŁA**
RewriteRule ^search/(.+)/page/([0-9]+)$ index.php?search=$1&page=$2                   **<- NIE DZIAŁA**
                   
RewriteRule ^crop/([a-zA-Z0-9]{10})$ index.php?crop=$1                                             **<- DZIAŁA**

RewriteRule ^category/(.+)$ index.php?category=$1                                                        **<- DZIAŁA**
RewriteRule ^category/(.*)/page/([0-9]+) index.php?category=$1&page=$2                    **<- NIE DZIAŁA**

RewriteRule ^category/(.*)/undercategory/(.*) index.php?category=$1&undercategory=$2          **<- DZIAŁA POD WARUNKIEM ŻE NIE MA INNYCH - CZYLI  tylko to plus dwie pierwsze linie**
RewriteRule ^category/(.*)/undercategory/(.*)/page/(.*) index.php?category=$1&undercategory=$2&page=$3           **<- NIE DZIAŁA**
1
DuzaCzarna napisał(a):

mój cały plik

Masz wyżej odpowiedź i wyjaśnienie. Przeczytaj to co napisałem.

TO:

RewriteRule ^software/(.+)$ index.php?software=$1 <- DZIAŁA
RewriteRule ^software/(.+)/page/([0-9]+)$ index.php?software=$1&page=$2 <- NIE DZIAŁA

nie ma prawa działać tak jak oczekujesz i zachowuje się poprawnie.

0

obscurity, katakrowa <----- ok, działa - zmiana kolejności faktycznie pomogła. dziękuję
dodałem jeszcze przekierowanie w wypadku błędu oraz blokade podglądu zawartości folderów - co jeszcze dla bezpieczeństwa lub standardów dodać? czyli [L] przy RewriteRule jest ok?

Options +FollowSymLinks
RewriteEngine On

ErrorDocument 404 http://www.test.pl/unfound

Options -Indexes

RewriteRule ^software/(.+)/page/([0-9]+) index.php?software=$1&page=$2 [L]
RewriteRule ^software/(.+) index.php?software=$1 [L] 

RewriteRule ^extension/(.+)/page/([0-9]+) index.php?extension=$1&page=$2 [L]
RewriteRule ^extension/(.+) index.php?extension=$1 [L]

RewriteRule ^search/(.+)/page/([0-9]+) index.php?search=$1&page=$2 [L]
RewriteRule ^search/(.+) index.php?search=$1 [L]
 
RewriteRule ^crop/([a-zA-Z0-9]{10}) index.php?crop=$1 [L]

RewriteRule ^category/(.*)/undercategory/(.*)/page/(.*) index.php?category=$1&undercategory=$2&page=$3 [L]
RewriteRule ^category/(.*)/undercategory/(.*) index.php?category=$1&undercategory=$2

RewriteRule ^category/(.*)/page/([0-9]+) index.php?category=$1&page=$2 [L]
RewriteRule ^category/(.+) index.php?category=$1 [L]
0
DuzaCzarna napisał(a):

co jeszcze dla bezpieczeństwa lub standardów dodać? czyli [L] przy RewriteRule jest ok?

Zrezygnować z Apache i .htaccess :-)
Oczywiście to półżart i generalnie jest OK. Jeśli to są domyślne ustawienia nowego serwera to raczej będzie OK.
Dziwi mnie jedynie dlaczego musiałeś dodać Options -Indexes?
Domyślnie pokazywał listę plików? Co to jest za serwer?

0

na razie strone testuję na localhost (wampserver) - tak czy inaczej nie chciałbym możliwości podglądów zawartości folderów - być może jest to standardowo zablokowane ale nie testowałem.

0

---------------------------------------> MUSZĘ WRÓCIĆ DO TEMATU <---------------------------------------

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^oferta/(.+) offer.php?offer=$1 [L]
RewriteRule ^oferta offer.php [L]

RewriteRule ^wydarzenia/(.+)/(.+) news.php?title=$1&id=$2 [L]
RewriteRule ^wydarzenia news.php [L]

RewriteRule ^admin/(.+)/(.+) admin.php?table=$1&id=$2 [L]
RewriteRule ^admin/(.+) admin.php?table=$1 [L]
RewriteRule ^admin admin.php [L]

---------------------------------------> wszystko działą oprócz admin nie działa <--------------------------------------

jak wpiszę to strona.pl/admin lub strona.pl/admin.php to wywala bez styli i w źródle strony jest link do css ale pliku już nie ma a prznajmniej się nie otwiera. Jak usunę z .htaccess te trzy ostatnie linie dotyczące admina to się otwiera admin.php prawidłowo. Dodam też, że mam dodany BASE w Mecie i odsyłanie do css w pozostałych plikach wygląda dokadnie tak samo - tam działa - tu nie. Może "admin" to jakaś wartość zabroniona? Ma ktoś pomysł co tu się dzieje?

testuje na localhost/wampserwer i działa tylko zmieniłem nazwę z admin na ap (admin-panel) ale mniejsza o to

RewriteRule ^ap/(.+)/(.+) ap/admin.php?table=$1&id=$2 [L]
RewriteRule ^ap/(.+) ap/admin.php?table=$1 [L]
RewriteRule ^ap ap/admin.php [L]

i mam to w podfolderze ap i w base mam <base href="/admin/"/> i działą

ale jak już wstawie na serwer i <base href="/"/> czy to dodam bezpośredni link do css http... to nie działa

PROSZĘ MOŻE KTOŚ COŚ BO MARNUJĘ TYLE CZASU PRZEZ TO

1 użytkowników online, w tym zalogowanych: 0, gości: 1