Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: .htaccess i pusty GET
Forum PHP.pl > Forum > Serwery WWW > Apache
jacek21
Witam,

W ramach bliższego zapoznania się z .htaccess postanowiłem zobaczyć z czym to się je, lecz już na samym początku klapa.

.htaccess
Kod
RewriteEngine On
RewriteBase /
#...
DirectoryIndex index.php
RewriteRule ^/?(.*)/(.*)/$ index.php?include=$1&d=$2 [NC,QSA,L]


index.php
Kod
[...]
<base href='http://localhost/darkraven/'></base>
#przykładowy link:
<a href="index.php/yes/loguj" alt='aa'>loguj</a>
#standardowo link wyglada podobnie jak w .htaccess, ale napisze:
<a hred='index.php?include=yes&d=loguj></a>

<?php
print_r($_GET); // Array();
?>
[..]


Powiecie mi dlaczego nie istnieje get ?
sowiq
To zależy pod jaki URL wchodzisz. Twoja reguła w .htaccess mówi, że nadpisane mają być adresy wyglądające tak: (tutaj coś lub nic)/(tutaj coś lub nic)/. W najprostszej postaci wyglądał by on tak: //, bo slashe są u Ciebie wymagane.
jacek21
adres jest taki: http://localhost/testhtaccess/index.php/yes/loguj
sowiq
Ten adres nie jest zgodny z Twoją regułą, bo /$ mówi, że na końcu ma być slash ($ oznacza koniec ciągu). Spróbuj /?$ albo zmień URL na http://localhost/testhtaccess/index.php/yes/loguj/ (slash na końcu). No i usuń z URL tę część: index.php/, bo przekierowanie na ten plik załatwia reguła z .htaccess.
nospor
No, a ma byc taki:
: http://localhost/testhtaccess/yes/loguj

przenosze
sowiq
Cytat(nospor @ 24.04.2013, 16:23:37 ) *

Jednak jak dla mnie chodzi tutaj o slash na końcu. W regule (.*)/ zmieści się również bez problemu index.php/yes/. Jedyne co nie pasuje to brakujący na końcu slash wink.gif
jacek21
a właśnie jak zmienie na link, bez index.php wywala info webserv'a, że został poprawnie zainstalowany...

a i dlaczego jak zmienie na:

/?$ or $ - gubi mi css'a


co jeszcze zauważyłem jak mama w pliku z menu link: protokół://host/folder/plik.php/
i jak w .htaccess dam bez '/' na końcu css działa a gdy zmienie w pliku z menu link na protokół://host/folder/plik.php już nie ma css'a nie ogarniam już tego
sowiq
Kolego, wkleję Ci hasła, poszukaj sobie sam odpowiedzi.

Cytat(jacek21 @ 24.04.2013, 18:17:55 ) *
a właśnie jak zmienie na link, bez index.php wywala info webserv'a, że został poprawnie zainstalowany...

-> RewriteBase

Cytat(jacek21 @ 24.04.2013, 18:17:55 ) *
a i dlaczego jak zmienie na:
/?$ or $ - gubi mi css'a

Widocznie ścieżka do CSS pasuje do podanej przez Ciebie reguły i zapytanie jest wysyłane do pliku index.php zamiast style.css. Musisz dodać warunek o istnieniu pliku - sprawdź sobie w którym miejscu to wstawić:
Kod
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d



Cytat(jacek21 @ 24.04.2013, 18:17:55 ) *
co jeszcze zauważyłem jak mama w pliku z menu link: protokół://host/folder/plik.php/
i jak w .htaccess dam bez '/' na końcu css działa a gdy zmienie w pliku z menu link na protokół://host/folder/plik.php już nie ma css'a nie ogarniam już tego

Zerknij wyżej.
jacek21
Znalazłem taki oto temat: http://forum.php.pl/lofiversion/index.php/t186300.html
no i tak się składa, że piszą tam iż base url załatwia sprawę a ja go mam(patrz 1 post).

nie rozumiem dlaczego regułka z /$ działa poprawnie a ta która wymaga lub nie(/?) czy też bez '/'($) już nie działa.. i brakuje css'a
użycie rewritecond mi nie pomogło :/

zmieniłem nawet ścieżkę do css'a na bezwzględną i nic nie dało, usunąłem base też nic.. coś musi być źle w .htaccess'ie
jeszcze raz pokażę jak wygląda plik:
Kod

RewriteEngine On
RewriteBase /testhtaccess/
#....
DirectoryIndex index.php
RewriteRule ^/?(.*)/(.*)/([0-9])/$ index.php?include=$1&d=$2&id=$3 [NC,L] -przy takim linku wszystko działa
RewriteRule ^/?(.*)/(.*)/?$ index.php?include=$1&d=$2 [NC,L]


wiem, że ten '/' na końcu to małe uniedogodnienie, ale muszę się dowiedzieć o co chodzi..

jeszcze tak na wszelki wypadek base i href do css'a

Kod
<base href='http://localhost/testhtaccess/'></base>

<link rel="stylesheet" type="text/css" href="/css/style.css" />
sowiq
Wklej cały .htaccess, który masz w swoim projekcie. Jeśli to to, co widać na górze, to nie ma tam żadnego RewriteCond.
jacek21
No cały, nie ma rewriteCond bo usunąłem, gdyż nie dawał żadnych efektów..
ale już doklejam aktualnie to wygląda tak:

Kod
RewriteEngine On
RewriteBase /darkraven/
#dodaj jeszcze plik z błedem
DirectoryIndex index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)/(.*)/([0-9])/$ index.php?include=$1&d=$2&id=$3 [NC,L]
RewriteRule ^/?(.*)/(.*)/?$ index.php?include=$1&d=$2 [NC,L]


no i teraz nie czyta css'a czy jes '/' czy tez go nie ma
sowiq
Spróbuj tak, powinno działać:

Kod
DirectoryIndex index.php

RewriteEngine On
RewriteBase /darkraven/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* - [PT,L]

RewriteRule ^/?(.*)/(.*)/([0-9])/$ index.php?include=$1&d=$2&id=$3 [NC,L]
RewriteRule ^/?(.*)/(.*)/?$ index.php?include=$1&d=$2 [NC,L]


I zachowaj trochę konsekwencji, bo w .htaccess masz: RewriteBase /darkraven/, a w HTML: <base href='http://localhost/testhtaccess/'></base>.
jacek21
no bo zmieniłem miejsce pracy smile.gif
co do kodu jeśli wchodzę w katalog główny nie ma css'a a gdy usiłuję wejść w jakiś dział błąd 404 ;/
sowiq
Kolego, ja jestem chętny do pomagania innym, ale też wykaż odrobinę więcej zainteresowania. Złap jakiś pierwszy lepszy kurs podstaw mod_rewrite i poczytaj. Bo to wygląda trochę tak, że Ty piszesz jakie są objawy (nawet nie podajesz pełnych informacji np. co do URL pod jaki wchodzisz) i oczekujesz że jakaś wróżka poda Ci na tacy gotowe rozwiązanie.

Poczytaj na początek chociażby to: http://bartosz.stasiurka.salon404.pl/post/...urs-mod-rewrite
jacek21
Nie jest tak, pytając niczego nie oczekuje jedynie mam nadzieję, że ktoś coś podpowie, nie liczę na to, że ktoś mi da gotowca czy też nawet, że ktoś w ogóle odpisze..
Przeczytałem już kilka kursów, ale brak mi doświadczenia z pracą w .htaccess'ie. a trudno go nabrać skoro kombinuję jak mogę, przeszukałem już pół google i do czego bym się nie zastosował wychodzi to samo.

Podaję objawy, piszę co się dzieje, co zmieniam, podaje linki cały czas opieram się na 2 i tych samych wersjach linków:
<a hre='yes/ogloszenia'></a> czyli: http://localhost/darkraven/yes/ogloszenia
<a hre='yes/ogloszenia/'></a> czyli: http://localhost/darkraven/yes/ogloszenia/

ponieważ cały czas próbuje uzyskać ten sam efekt, żeby wersja linku pierwszego również działał, w linkach nic nie zmieniam bo co ja tam mogę zmienić jeśli chodzi mi jedynie o slash'a na końcu ?

Przepraszam, ale w ogóle nie wiem dlaczego masz do mnie pretensje ? co ja mogę więcej napisać ? jeśli brakuje ci jakiś informacji i chcesz pomóc to zadaj pytanie a nie oskarżaj mnie, że w ogóle nie wykazuje żadnego zainteresowania bo tak nie jest, nie będę przecież pisał tutaj wszystkiego co robię bo jaki to ma cel ?
sowiq
Cytat(jacek21 @ 25.04.2013, 16:11:00 ) *
Przepraszam, ale w ogóle nie wiem dlaczego masz do mnie pretensje ?

Kolego, nie mam do nikogo żadnych pretensji. Po prostu odniosłem wrażenie, że wklejasz sobie rozwiązanie i na forum piszesz, że coś nie działa, bez żadnych szczegółów. Jeśli tak nie jest, to przepraszam.

Wracając do rzeczy - robisz zbyt ogólne wyrażenia regularne. Do takiego wzorca: /(.*)/ będzie pasowało wszystko to: /foo/, /foo-bar/, /foo/bar/baz/, //. Kropka oznacza dowolny znak, gwiazdka dowolną ilość powtórzeń (również zero). Dlatego Twoje reguły mieszają się między sobą.

Zamiast /(.*)/, dużo lepszym pomysłem jest dawać: /([^/]+)/, czyli jeden lub więcej znaków różnych od / otoczonych slashami. Taki wzorzecz będzie pasował do /foo/ i /foo-bar/, ale do /foo/bar/baz/ i // już nie.

Zakładając, że będziesz miał dwa typy adresów:
- /yes/ogloszenia
- /no/ogloszenia

powinieneś zrobić taką regułę:
Kod
RewriteRule ^(yes|no)/([^/]+)/?$ index.php?include=$1&d=$2 [NC,L]


Do tego wszystkie (.*) pozamieniać na podane wcześniej ([^/]+). Warunku na początkowy slash możesz nie pisać, bo i tak nie jest nigdy dodawany. Końcowy - owszem.

Odpaliłem i sprawdziłem. U mnie wszystko działa. Jeśli u Ciebie nie chce, to znaczy, że Twój problem leży gdzie indziej.
Kod
DirectoryIndex index.php

RewriteEngine On
RewriteBase /darkraven/

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [PT,L]

RewriteRule ^([^/]+)/([^/]+)/([0-9])/?$ index.php?include=$1&d=$2&id=$3 [NC,L]
RewriteRule ^(yes|no)/([^/]+)/?$ index.php?include=$1&d=$2 [NC,L]

Pozdrawiam.
jacek21
Przed wejściem na forum też zmieniłem wyrażenie regularne na:

Kod
RewriteRule ^([a-z]+)/([a-z]+)/([0-9])/?$ index.php?include=$1&d=$2&id=$3 [NC,L]
RewriteRule ^([a-z]+)/([a-z]+)/?$ index.php?include=$1&d=$2 [NC,L]


i zadziałało smile.gif Dziękuje bardzo za wszelką pomoc i stracone nerwy(przez te niedomówienia).
Oraz za wyjaśnienie przy okazji dlaczego (.*) jest złym pomysłem ^^

E: dużo czasu poświęciłem na tą 'zagadkę', ale jakby nie to, to pewnie nie poświęciłbym tyle czasu na .htaccess'a a przez to ominąłbym wiele ciekawych artykułów..

pozdrawiam
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.