Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Nette urls in .htaccess met en zonder 'language'

Pagina: 1
Acties:

  • Stefan|IA2
  • Registratie: Mei 2008
  • Laatst online: 29-06-2021
Hallo Tweakers!

Ik zit met een klein probleempje en ik kan er maar niet uit komen. Ik heb overigens al het één en ander geprobeerd met de zogehete 'flags' achter de rules maar dat heeft ook niet zo heel veel zin. De informatie van de flags had ik overigens gevonden via Google.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Options +FollowSymLinks
RewriteEngine On

<Files "config.php">
    Order Allow,Deny
    Deny from All
</Files>

RewriteBase /

RewriteRule ^(.*)/sitemap_index.xml$ indexing.php?language=$1&type=sitemap_index [L,NC]
RewriteRule ^sitemap.xml$ indexing.php?type=sitemap [NC]

RewriteRule ^stylesheet.css$ stylesheet.php [NC]
RewriteRule ^robots.txt$ indexing.php?type=robots [NC]

RewriteRule ^(.*)/(.*)/(.*)/(.*)/$ index.php?language=$1&page=$2&sub=$3&subsub=$4 [L,NC]

RewriteRule ^(.*)/(.*)/(.*)/$ index.php?language=$1&page=$2&sub=$3 [NC]
RewriteRule ^(.*)/(.*)/(.*)/$ index.php?page=$1&sub=$2&subsub=$3 [L,NC]

RewriteRule ^(.*)/(.*)/$ index.php?language=$1&page=$2 [NC]
RewriteRule ^(.*)/(.*)/$ index.php?page=$1&sub=$2 [L,NC]

RewriteRule ^(.*)/$ index.php?page=$1 [NC]
RewriteRule ^(.*)/$ index.php?language=$1 [L,NC]


Nu maak ik verschillende type urls:
/lang/page/sub/subsub/ => werkt
/lang/page/sub/ => werkt niet ?
/lang/page/ => werkt
/lang/ => werkt

/page/sub/subsub/ => werkt
/page/sub/ => werkt
/page/ => werkt
/ => werkt

Wat doe ik hier verkeerd of doe ik het helemaal verkeerd? Is er een oplossing voor dit probleem want Googlen heeft mij niet veel verder geholpen...

Alvast bedankt!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

Wat is het verschil tussen deze rules:
RewriteRule ^(.*)/(.*)/(.*)/$ index.php?language=$1&page=$2&sub=$3 [NC]
RewriteRule ^(.*)/(.*)/(.*)/$ index.php?page=$1&sub=$2&subsub=$3 [L,NC]
?
Kan je niet gewoon beter alles waar lang eerste parameter is afdwingen? Of nog helemaal anders doen, en bijvoorbeeld zoals [google]cakephp[/url] een url router maken? (Want dit is ook niet echt dynamisch.)

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


  • semicolon
  • Registratie: Mei 2004
  • Niet online
1) Ik mis de RewriteCond's die ervoor zorgen dat je requests naar bestaande bestanden niet ook rewrite?

2) Is het niet veel handiger om, op eventueel enkele uitzonderingen na, alle requests door te sturen naar php, en daarbinnen af te handelen wat er opgevraagd wordt. Zoals lbmos2warp ook al aanraadde. Met je eigen 'url router'.

3) Gezien sommige regulaire expressies hetzelfde zijn, (bijvoorbeeld voor /lang/ en /page/, beide zijn gewoon (.*)), kun je voor language niet gewoon afdwingen welke opties er zijn. Ala (en|de|nl|fr) bijvoorbeeld? Zodat ze niet per ongeluk naar page/sub/ gaan als ze lang/page opvragen.. (en vice versa)

ps.) Die config.php forbidden maken is vrij zinloos, zelfs als iemand hem opvraagt krijgen ze gewoon een lege pagina terug - atlhans ik ga ervan uit dat hij alleen configuratie variabelen bevat en geen output geeft. Ideaal zou het zijn als je hem buiten de document root zet, maar dat is niet altijd een optie uiteraard.

:D/-<


Verwijderd

Inderdaad is een router stukken makkelijker, dit hoeft niet eens echt super-geavanceerd te zijn voor een simpele site die niet veel dynamische menu's heeft, heeft de site wel echt dynamisch menu kun je het nog altijd uit de DB trekken.

simpel voorbeeld :

in je .htaccess vang je alles requests die niet bestaan af

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
</IfModule>


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// je maakt een statische of dynamische route table
$routes = array(
 'en/latest-news' => array( 'page' => 3, 'language' => '1', 'sub' => 34), 
 'nl/llaatste-nieuws' => array( 'page' => 65, 'language' => '2', 'sub' => 34), 
);

$route = isset($_GET['route'])  ? $_GET['route'] : false;

if($route)
{
  if(isset($routes[$route]))
  {
    $currentroute = $routes[$route]; 
    foreach($currentroute as $var => $val) 
    {
       $_GET[$var] = $val; 
    }

  }
}


In dit voorbeeld overschrijf je $_GET vars, beetje smerig maar dit zou in jouw toepassing goed uitkomen denk ik, dan hoef je de verdere afhandeling van je routing/pagina's etc niet aan te passen.

Meeste vergelijkbare oplossingen werken niet met een $_GET var zoals deze, maar gebruiken de REQUEST_URI ... voordeel van deze methode is dat het ook makkelijk werkt indien er geen rewrite beschikbaar is, simpelweg door ?route=my/route/to-content te doen.

[ Voor 12% gewijzigd door Verwijderd op 22-02-2011 13:32 ]


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 12:00

MueR

Admin Devschuur® & Discord

is niet lief

Waar hoort mijn topic?: rewrites mogen naar Serversoftware en Windows Servers.

Overigens ben je erg omslachtig bezig. Je kan veel beter gewoon de request uri in zn geheel in PHP parsen. Met wat simpele switch statements ben je er dan.

Anyone who gets in between me and my morning coffee should be insecure.