Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mod rewrite] niedziałający mod rewrite
Forum PHP.pl > Forum > Przedszkole
Demoneos
Mój plik .htaccess wygląda następująco:
Kod
RewriteEngine on
  RewriteRule ^home$ ?url=home


Na stronie index.php ondośnik jest zbudowany w następujący sposób:
Kod
<a href="home">Home</a>


Plik ster.php odpowiedzialny za ustalenie jaka treść ma się wczytać zawiera m. in. taki kod:
Kod
if (!isset($_REQUEST["url"]))
        $url="home";
    else
        $url=$_REQUEST["url"];

case "home":
           include ("home/home.php");


Niestety link nie dziala, po kliknięciu na opcję Home zamiast strony home.php przeglądarka wchodzi do katalogu home.
Czy to ja popełniłem jakieś błedy, czy może po prostu mod rewrite może nie działać na moim serwerze (Apache/2.2.9 (Win32) PHP/5.2.6) z jakiegoś niezależnego ode mnie powodu (a jeśli tak, to czy da się to jakoś sprawdzić)?

P.S Dodam tylko, że jeżeli odnośniki były skonstruowane "normalnie", np.
Kod
<a href="?url=home">Home</a>

linki działały poprawnie.
Maxik
Kod
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^home$ ?url=home [L]


Spróbuj tak
Demoneos
Cytat(Maxik @ 12.07.2008, 17:53:04 ) *
Kod
RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^home$ ?url=home [L]


Spróbuj tak


Niestety nie działa. Zakładam, że kod który podałeś jest dobry, znaczyłoby to, że z jakiegoś powodu mod rewrite w ogóle nie działą.

P.S Jeżeli apache jest zainstalowany w:
D:\SERWER\
a strona na
D:\SERWER\htdocs\test
to gdzie ten plik ma być umieszczony? Próbowałem i tu i tu, ale nie działą.
Maxik
.htaccess dajesz w folderze gdzie masz stronę(tak jest najwygodniej). Zamiast ^home$ daj po prostu home
Demoneos
Częściowo działa. Piertwotnie plik. httpd.conf zawierał m.in taki kod (wybrałem tylko te fragmenty, któreg wg. mnie mogą być związane z konfiguracją mod rewrite):
Kod
       ......................
      
       <Directory />
           Options FollowSymLinks
           AllowOverride None
           Order deny,allow
           Deny from all
       </Directory>
      
       #
       # Note that from this point forward you must specifically allow
       # particular features to be enabled - so if something's not working as
       # you might expect, make sure that you have specifically enabled it
       # below.
       #
      
       #
       # This should be changed to whatever you set DocumentRoot to.
       #
       <Directory "D:/PHP_SERWER/htdocs">
           #
           # Possible values for the Options directive are "None", "All",
           # or any combination of:
           #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
           #
           # Note that "MultiViews" must be named *explicitly* --- "Options All"
           # doesn't give it to you.
           #
           # The Options directive is both complicated and important.  Please see
           # http://httpd.apache.org/docs/2.2/mod/core.html#options
           # for more information.
           #
           Options Indexes FollowSymLinks
      
           #
           # AllowOverride controls what directives may be placed in .htaccess files.
           # It can be "All", "None", or any combination of the keywords:
           #   Options FileInfo AuthConfig Limit
           #
           AllowOverride None
      
           #
           # Controls who can get stuff from this server.
           #
           Order allow,deny
           Allow from all
      
       </Directory>
        
       ..............
      
       <Directory "D:/PHP_SERWER/cgi-bin">
           AllowOverride None
           Options None
           Order allow,deny
           Allow from all
       </Directory>
      
       .....................

Przy takim ustawieniu mod rewrite nie działoło. Dokonałem kilka zmian, po których powyższy kod wygląda następująco (4 linijki w których dokonałem zmian oznaczłyem w następujący sposób: # ZMIANA):
Kod
       <Directory />
           Options FollowSymLinks
           AllowOverride All # ZMIANA
           #Order deny,allow # ZMIANA
           #Deny from all # ZMIANA
       </Directory>
      
       #
       # Note that from this point forward you must specifically allow
       # particular features to be enabled - so if something's not working as
       # you might expect, make sure that you have specifically enabled it
       # below.
       #
      
       #
       # This should be changed to whatever you set DocumentRoot to.
       #
       <Directory "D:/PHP_SERWER/htdocs">
           #
           # Possible values for the Options directive are "None", "All",
           # or any combination of:
           #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
           #
           # Note that "MultiViews" must be named *explicitly* --- "Options All"
           # doesn't give it to you.
           #
           # The Options directive is both complicated and important.  Please see
           # http://httpd.apache.org/docs/2.2/mod/core.html#options
           # for more information.
           #
           Options Indexes FollowSymLinks
      
           #
           # AllowOverride controls what directives may be placed in .htaccess files.
           # It can be "All", "None", or any combination of the keywords:
           #   Options FileInfo AuthConfig Limit
           #
           AllowOverride All # ZMIANA
      
           #
           # Controls who can get stuff from this server.
           #
           Order allow,deny
           Allow from all
      
       </Directory>
      
       ...............
      
       <Directory "D:/PHP_SERWER/cgi-bin">
           AllowOverride None
           Options None
           Order allow,deny
           Allow from all
       </Directory>


plik .htaccess wygląda następująco:
Kod
   Options FollowSymLinks
   RewriteEngine On
  
   RewriteRule home ?url=home

Jak już zaznaczyłem, mod rewrite działa po tych zmianach tylko częściowo, tzn. linki są już takie jak chcę, tzn. w pliku index.php
Kod
<a href="home">Strona glowna</a>

Plik ster.php
Kod
   if (!isset($_REQUEST["url"]))
           $url="home";
       else
           $url=$_REQUEST["url"];
  
       switch ($url)
       {
           case "home":
               include ("home/home.php");
         .........................

I kiedy najadę kursorem myszki na link, na pasku statusu przeglądarki widnieje link:
http://192.168.0.1/htdocs/home
Kiedy kliknę wczytuje mi się właściwa strona home.php
Czyli wszystko jest w porządku, tylko że po wczytaniu tej strony w polu adresu przeglądarki jest następujący adres:
http://192.168.0.1/htdocs/home/?url=home
a powinno być chyba:
http://192.168.0.1/htdocs/home

Gdzie leży przyczyna? Może źle skonfigurowałem plik httpd.conf? Czy ktogolwiek go konfiguorował w wersji Apache/2.2.9 (Win32) PHP/5.2.6), pod kątem mod rewrite?
Maxik
Zapomniałeś o fladze przy przepisaniu smile.gif Daj tak: RewriteRule home ?url=home [L] i powinno działać.
Demoneos
Cytat(Maxik @ 13.07.2008, 18:32:45 ) *
Zapomniałeś o fladze przy przepisaniu smile.gif Daj tak: RewriteRule home ?url=home [L] i powinno działać.

Niestety ciągle to samo. Włąściwie to działa, tylko wyświetlany jest nieprawidłowy adres w polu adresu.
Gdybym nie używał mod rewrite to miałby taki przykładowy adres:
http://192.168.0.1/htdocs/?url=home

Po zastosowaniu mod rewrite adres powinien być zbudowany w ten sposób:
http://192.168.0.1/htdocs/home
A niestety wygląda tak:
http://192.168.0.1/htdocs/home/?url=home
Czyli tą pierwsza część jest prawidłowa, ale nie potrzebne dodawana jest końcówka /?url=home
Pitter
Wydaje mi się że problem tkwi w wykonaniu adresu. Po prostu ty próbujesz przywołać adres taki jak naprawde nie istnieje. spróbuj normalnie czyli:
Kod
if($_GET['url']=='home')
{
// to co ma się wyświetlnić
}

odnośnik <a href="home">Home</a>



Dlaczego tak? Ponieważ modrewrite maskuje adres a nie zmienia jego strukturę. Adres zawsze będzie ?url=home tyle że w inne postaci.
Demoneos
Cytat(Pitter @ 13.07.2008, 20:17:39 ) *
Wydaje mi się że problem tkwi w wykonaniu adresu. Po prostu ty próbujesz przywołać adres taki jak naprawde nie istnieje. spróbuj normalnie czyli:
Kod
if($_GET['url']=='home')
   {
   // to co ma się wyświetlnić
   }
  
   odnośnik <a href="home">Home</a>



Dlaczego tak? Ponieważ modrewrite maskuje adres a nie zmienia jego strukturę. Adres zawsze będzie ?url=home tyle że w inne postaci.

Wciąż to samo smile.gif
b4x
Kod
Options +FollowSymLinks
RewriteEngine On
# zakładam że w pliku ster.php wykonujesz to co jest pod url: == home;P
RewriteRule ^home$ ster.php?url=home
Demoneos
Cytat(b4x @ 13.07.2008, 21:05:22 ) *
Kod
Options +FollowSymLinks
                     RewriteEngine On
                     # zakładam że w pliku ster.php wykonujesz to co jest pod url: == home;P
                     RewriteRule ^home$ ster.php?url=home


W tej chwili zgodnie z Waszymi wskazówkami, o ile je dobrze zrozumiałem, mam tak zorganizowane pliki:
index.php
Kod
     <div>
       <a href="home">Home</a>
       </div>
       <div>
       <?php
       include ("sterowanie.php");
       ?>
       </div>
       <div>footer</div>


sterowanie.php
Kod
     if($_GET['url']=='home')
       {
          // treść
       }


.htaccess
Kod
     Options FollowSymLinks
       RewriteEngine On
       RewriteRule ^home$ sterowanie.php?url=home


Pliki index.php sterowanie.php oraz .htacces są w katalogu htdocs.

Po kliknięciu w link Home wyświetla mi się teraz pusta strona z błędem:

Forbidden
You don't have permission to access /htdocs/ on this server.
b4x
Kod
Options +FollowSymLinks  # - jeśli to nie zadziała spróbuj usunąć tą linijkę
RewriteEngine On
RewriteRule ^home$ sterowanie.php?url=home
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.