.htaccess mod_rewrite och filstruktur-krock

Tråden skapades och har fått 10 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2004-09-14 12:32

Har lite problem med hur jag strukturerar mina filer och hur min mod_rewrite skriver om adresser.

Ibland händer det att min filstruktur stämmer överens med vad som står i adressraden och då så kör apache över mod_rewrite-reglerna och nöjer sig med att den hittat filen.

Tex om man skriver

domain.com/users/ så fungerar inte mod_rewrite-regeln som försöker skriva om den adressen till index.php?goto=users.php eftersom apache letar efter en fil eller katalog som heter users och i httpd.conf så står ju .php som möjlig filändelse så apache hittar ju tillslut att users.php ligger på root-nivå och kör den rakt av istället för att inkludera den från index.php som det är tänkt.

Nu undrar jag, är det här ett vanligt problem som enkelt går att konfigurera om apache för eller ska jag flytta om alla mina filer till en include-mapp så filstrukturen lokalt aldrig stämmer överens med den från adressraden?

  • Medlem
  • Stockholm
  • 2004-09-15 00:15

Okej jag kanske är lite väl optimistisk men jag trodde verkligen jag skulle få svar inom någon timma

Finns ju hur många webgurus som helst här... är det ingen av er som konfiggat mod_rewrite ??

Jag har inte hackat så mycket Apache config, men jag har hackat en del mod_rewrite. Jag kunde dock inte komma på om jag stött på det där problemet eller inte. Jag tror jag gjorde det en gång, men för att kolla upp det var jag tvungen att testa igen och det var jag för lat för.

Men om du ger ett konkret exempel och din exakta .htaccess-fil (eller i alla fall den delen som anropar mod_rewrite) så kan jag testa på en webbserver för att se om jag ser samma problem.

  • Medlem
  • Stockholm
  • 2004-09-15 01:01

Exempel .htaccess

RewriteEngine on
RewriteRule ^about/show/?$ index.php?goto=about/show.php         [L]

lägg åvanstående kod i en .htaccess-fil i tex en mapp "test". Skapa sedan en index.php-fil i mappen test som har följande kod

$GLOBALS['worked'] = "Ja det fungerade!";
require_once($_GET['goto']);

inuti mappen "test" skapar du en mapp som heter about och inuti den en fil som heter show.php.
Filstrukturen är alltså
/test/
/test/.htaccess
/test/index.php
/test/about/
/test/about/show.php

I show.php skriver du

<?php echo $GLOBALS['worked']; ?>

Problemet är alltså att show.php kommer köras av apache direkt istället för att mod_rewrite-regeln körs och index.php får inkludera show.php

Lutar mot att jag lägger allt inkluderingsmaterial i en "include"-mapp så slipper jag det här

Kolla här: http://www.adrianb.info/testivar/about/show/

Det totalskumma var att först fungerade det inte, sen ändrade jag i .htaccess-filen. Då fungerade det inte heller. Då ändrade jag tillbaka. Då fungerade det. Jag har faktiskt varit med om liknande förut när jag bråkat med mod_rewrite, jag var tvungen att orsaka ett "internal server error" för att få en redirect att fungera.

  • Medlem
  • Stockholm
  • 2004-09-15 15:00

Man tackar !

Vet inte exakt hur ska lösa det, men antar att jag provar redigera htaccessfilen och ändrar jag tillbaks och hoppas det fungerar.

Känns stabilt

Som sagt, i värsta fall läggs allt i en inkluderingsmapp, inte så värst farligt.

Ibland kan man spara en hel del tid på att inte lösa ett problem utan kringgå det. Men då brukar den där problemlösarnerven klaga...

Om det spelar någon roll så var detta ändringen jag försökte mig på (men som alltså inte fungerade):

RewriteRule ^/testivar/about/show/?$ index.php?goto=about/show.php         [L]

Sen ändrade jag tillbaka till detta och nu verkar det fungera.

RewriteRule ^about/show/?$ index.php?goto=about/show.php         [L]

Hur det gick till vet jag faktiskt inte

  • Medlem
  • Stockholm
  • 2004-09-15 17:41

säkert någon störig apache-cache-finess som man nollställer... nåväl, studier all day long. Snart börjar det roliga

  • Medlem
  • Stockholm
  • 2004-09-16 17:58

Nä fasen, löste sig inte så jag flyttade filerna till en include-mapp och la till den i includepath så det var ju ett rätt smidigt sätt att lösa det hela på ändå.

Men en annan sak jag funderat på.. Hur gör man för att inte bli av med GET-variabler när man använder mod_rewrite ?

  • Medlem
  • Stockholm
  • 2004-09-16 21:11

Har för mig att du måste använda flaggan [PT] för att GET-variablerna ska funka, alltså:

RewriteRule ^about/show/?$ index.php?goto=about/show.php [PT]

Minns inte exakt vad den gör, du får kolla i dokumentationen. [L]-flaggan som du kör med vet jag inte heller vad den gör.

  • Medlem
  • Stockholm
  • 2004-09-16 22:29

Fattar inte varför jag inte tog mig tiden att läsa igenom flaggorna... tänkte väl inte på att det kunde finnas en flagga.
[L].står för att om regeln används så är det den sista som ska användas.

Nu har jag hittat [QSA] som står för QueryStringAppend.

Alltså, allt fungerar utmärkt nu när jag skriver [QSA,L] ... whoppa !

1
Bevaka tråden