Mod rewrite - pomoc

Chcę uzyskać prosty efekt:

/coś to index.php?page=coś

/coś/inne to index.php?page=coś&subpage=inne

+oczywiście przekierowanie, jeżeli nie ma końcowego /.

Nie mogę się połapać w regułach mod rewrite, daję kod, który wyprodukowałem jakoś sam :P.

DirectoryIndex blank.txt blank.html blank.html index.txt index.htm index.html index.php


RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d


RewriteRule ([a-zA-Z]+)/([a-zA-Z]+)$ /$1/$2/ [R]

RewriteRule ([a-zA-Z]+)/$ /$1/ [R]


RewriteRule ([a-zA-Z]+)/$ index.php?page=$1

RewriteRule ([a-zA-Z]+)/([a-zA-Z]+)/$ index.php?page=$1&subpage=$2

Zmienne są na pewno dobrze odbierane przez skrypt. W przykładzie z jedna zmienna po / chyba mi się zapętla reguła, w drugim pierwsza zmienna zawsze wynosi “php” o.O.

A nie wystarczy?

Options FollowSymLinks SymLinksIfOwnerMatch

RewriteEngine On


RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?page=$1&subpage=$2 [L]

RewriteRule ^([a-zA-Z]+)$ index.php?page=$1 [L]

Podczas 2 zmiennych bez ostatniego / FF wypluwa:

Czyli chyba zapętlanie, ale nie che mi się wierzyć - przecież to najprostszy przykład :lol:.

…aaa, a czy przypadkiem tutaj slash nie powinien być poprzedzony backslashem?

RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)$ index.php?page=$1&subpage=$2 [L]

Teraz jeszcxe większy kibel:

/a przekierowuje na /a/ - dobrze, ale 404,

/a/b przekierowuje na /b/ - źle, 404

reszta ręcznie wpisywana to 404.

nie qmam…

Co Ty właściwie chcesz zrobić? przekierowanie czy przyjazny adres?

Zakładając że to drugie, to w przypadku reguł które podałem:

wpisując w przeglądarce url: http://localhost/a** /b’>http://localhost/a/b**

w pliku testowym index.php o treści:

<?php

echo 'page: '.$_GET['page'].'
subpage: '.$_GET['subpage'];

?>

dostaję:

page: a

subpage: b

-czyli ok.

wpisując adres: http://localhost/a

dostaję:

page: a

subpage:

-czyli też ok

Więc?

Chcę stworzyć przyjazj=ne URLe (takie amatorskie :P).

Po wpisaniu /a przekierowuje na /a/ (czyli dobrze), ale dostaję 404 nie wiem dlaczego.

No to co ty powpisywałeś do tego .htaccess ?

Wklej jego aktualną zawartość.

DirectoryIndex blank.txt blank.html blank.html index.txt index.htm index.html index.php


RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d


RewriteRule ([a-zA-Z]+)$ /$1/ [R]

RewriteRule ([a-zA-Z]+)/([a-zA-Z]+)$ /$1/$2/ [R]


RewriteRule ^([a-zA-Z]+)$ index.php?page=$1 [L]

RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)$ index.php?page=$1&subpage=$2 [L]

A co ja pisałem wcześniej?

Nic dziwnego że wyskakuje 404 jak przez te pierwsze niezwykle pomysłowe przepisania odsyła do nieistniejącej lokalizacji :x

Całość ma wyglądać tak:

DirectoryIndex blank.txt blank.html blank.html index.txt index.htm index.html index.php


RewriteEngine On

RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)$ index.php?page=$1&subpage=$2 [L]

RewriteRule ^([a-zA-Z]+)$ index.php?page=$1 [L]

/aaa/bbb/ nadal wypluwa 404… (ale bez końcowego / jest dobrze, lecz tak też powinno działać).

No to zmień np. na:

DirectoryIndex blank.txt blank.html blank.html index.txt index.htm index.html index.php


RewriteEngine On

RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)([/])$ index.php?page=$1&subpage=$2 [L]

RewriteRule ^([a-zA-Z]+)([/])$ index.php?page=$1 [L]

OK, działa, ale i tak muszę zrobić te “swoje przekierowania”, aby zmienne działały bez końcowego /. Już więcej nic nie potrzebuję. W razie czego wiem, że błąd jest w przekierowaniach.

Dziękówka.

DirectoryIndex blank.txt blank.html blank.html index.txt index.htm index.html index.php


RewriteEngine On

RewriteRule ^([a-zA-Z]+)\/([a-zA-Z]+)([/]?)$ index.php?page=$1&subpage=$2 [L]

RewriteRule ^([a-zA-Z]+)([/]?)$ index.php?page=$1 [L]

to powinno działać, niezależnie od tego, czy / na końcu jest, czy go nie ma, nie jestem nawet pewien czy potrzebne są ostatnie nawiasy, niestety nie mam możliwości sprawdzenia w tej chwili

Działa idealnie.

Muszę się wziąć za wyrażenia regularne :).

W dniu 31.05.2008 , o godzinie 17:43 został dopisany post przez pavobe

Post pod postem, ale już nikt tutaj nie zagląda…

W jaki sposób pozwolić na - (myślniki) w nazwach zmiennych w adresie?

Dopisujesz go w kwadratowym nawiasie:

DirectoryIndex blank.txt blank.html blank.html index.txt index.htm index.html index.php


RewriteEngine On

RewriteRule ^([a-zA-Z-]+)\/([a-zA-Z-]+)([/]?)$ index.php?page=$1&subpage=$2 [L]

RewriteRule ^([a-zA-Z-]+)([/]?)$ index.php?page=$1 [L]