trailing slash mod rewrite

Pagina: 1
Acties:

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik heb het volgende in mijn htaccess:

RewriteRule ^([^/]+)/$ index.php?dir=$1 [L]
RewriteRule ^([^/]+)/(.+)\.html$ index.php?dir=$1&file=$2 [L]

Dit werkt erg goed voor:

http://subdomain.domain.nl/dir/filename.html

en

http://subdomain.domain.nl/dir/

, het werkt niet voor:

http://subdomain.domain.nl/dir

Ik wil graag dat:

http://subdomain.domain.nl/dir

wordt doorgestuurd naar:

http://subdomain.domain.nl/dir/

Is dat mogelijk?

Ik heb al een redirect geprobeert, maar dat leidde tot een oneindige loop lijkt wel!

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Dit moet toch niet zo moeilijk zijn? Ik heb al weer van alles geprobeert... de tutorials eral op nageslagen...

Dit geprobeert"

RewriteRule ^([^/]+)/?$ index.php?dir=$1 [L]
RewriteRule ^([^/]+)/(.+)\.html$ index.php?dir=$1&file=$2 [L]

Maar het mag niet baten!

[ Voor 44% gewijzigd door RSD op 16-03-2006 18:56 ]


  • Mac_Cain13
  • Registratie: Juni 2003
  • Laatst online: 27-01 22:51
Wat wil je eigenlijk precies doen? Voor een URL met 1 dir erin is het me wel duidelijk, maar wat wil je als je 2 keer een dir je URL hebt? Bijvoorbeeld http://subdomain.domain.nl/dirA/dirB/fileC.html.

Heb je in het geval van het voorbeeld alleen dirB nodig, beide dir's of kan deze situatie gewoon niet bij jou? Aan je regex te zien vermoed ik namelijk dat je probeerd alleen dirB te pakken, maar ik heb geen idee of dat ook echt zo is. ;)

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Ik heb eigenlijk alleen DirA en FileC, maar als het probleem met de trailing slash ook voor meerdere combinaties kan zou mooi zijn, dan kan ik het uitbreiden. Het zou nog mooier zijn als ik oneindig veel dirs kan hebben.

[ Voor 17% gewijzigd door RSD op 17-03-2006 11:51 ]


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Ik zou eerlijkgezegd elk path gewoon je PHP bestand in laten komen, en met explode de dir / paths / file achterhalen :) .

code:
1
RewriteRule ^(.*)$ index.php?path=$1

PHP:
1
2
3
4
5
$path = $_GET['path'];
$path_parts = explode("/", $path);
$reversed_path_parts = array_reverse($path_parts);
$file = $reversed_path_parts[0];
$last_dir = $reversed_path_parts[1];
:) .

DM!


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
code:
1
2
3
#Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)$ index.php?path=$1 [L]

Dit is mijn htaccess en
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$subdomein = explode(".$domein",$_SERVER["HTTP_HOST"]);
$subdomein = ($subdomein[0]=="www") ? $subdomein[1] : $subdomein[0];

$path = $_GET["path"]; 
$path_parts = explode("/", $path); 
$reversed_path_parts = array_reverse($path_parts); 
$file = $reversed_path_parts[0]; 
$last_dir = $reversed_path_parts[1]; 

echo "$path<br>";
echo "Subdomein: $subdomein<br>";
echo "Domein: $domein<br>";
echo "Dir: $last_dir<br>";
echo "File: $file<br>";

is mijn php nu... echter krijg ik als path nu index.php te zien :?

Ik begrijp er niks meer van

[ Voor 42% gewijzigd door RSD op 17-03-2006 13:50 ]


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Volgens mij kan die niet met slashes werken. Als ik:

code:
1
2
3
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(1/2\.html)$ /index.php?path=$1


en ik roep aan:

http://subdomein.domein.nl/1/2.html

dan geeft hij wel:

Path: 1/2.html
Subdomein: subdomein
Domein: domein
Dir: 1
File: 2.html

Doe ik echter:

code:
1
2
3
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.*)$ index.php?path=$1


dan doet hij het niet goed en geeft hij:

index.php
Subdomein: ddd
Domein: 12nieuws.nl
Dir:
File: index.php

[ Voor 8% gewijzigd door RSD op 17-03-2006 14:07 ]


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Natuurlijk doet 'ie dat :) . Hij rewrite nu ook de aanvraag naar index.php... Oplossing:

code:
1
2
3
4
5
6
RewriteEngine On

RewriteCond %{REQUEST_FILENAME}  !-f
RewriteCond %{REQUEST_FILENAME}  !-d

RewriteRule ^(.*)$ index.php?request=$1

DM!


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Heb hem nu zo:

code:
1
2
3
4
5
6
7
8
RewriteEngine on
RewriteCond %{REQUEST_URI} !/$ 
RewriteCond %{REQUEST_URI} !\.
RewriteRule ^(.*) /$1/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php?path=$1 [QSA]

Werkt goed, alleen het gebueren met de trailing slash vind ik nog een beetje tricky. Dat isniet zo netjes opgelost volgens mij door die conditions!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 20:34
Ik snap niet precies wat je wil bereiken denk ik. Het standaard trailing slash probleem staat gewoon in de manual en ziet er zo uit:
code:
1
2
3
4
RewriteEngine  on
RewriteBase    /~quux/
RewriteCond    %{REQUEST_FILENAME}  -d
RewriteRule    ^(.+[^/])$           $1/  [R]


Als het gaat om het verwerken van een virtueel URL dan doe ik het eigenlijk altijd met behulp van multiviews. Onderstaand een object om multiviews URL te behandelen. Nadeel van multiviews is dat ze pas te behandelen zijn vanuit een daadwerkelijke script-aanroep. /pagina/foo/bar/ is vanuit pagina.php prima om te zetten in $arg1=foo $arg2=bar. Om de boel netjes te laten werken bij een aanroep als domein.nl/virtualdir/virtualdir2 komt er een rewriterule kijken.
Gegeven dat a) multiviews aan staan; en b) pathinfo wordt doorgegeven door Apache werkt het volgende.
code:
1
2
3
4
5
6
#.htaccess
RewriteEngine on
RewriteBase   /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index/$1

Dit zorgt ervoor dat elk request naar een niet bestaand bestand wordt vertaald naar een request naar index(.php) met daar achter de pathinfo.
In index.php kun je een (/de) instantie aanroepen van onderstaande urlHandler klasse. Deze heeft vervolgens een property uriArgs die een array entry bevat voor elk deel van het url, waarbij een deel wordt gescheiden door een '/'.
Met een index.php die er zo uit ziet:
PHP:
1
2
3
4
$URL = &URLhandler::getInstance();
foreach($URL->uriArgs as $param) {
    echo '<li>' .$param;
}

Levert een request naar domein/foo/bar(/) dan:
code:
1
2
* foo
* bar


De klasse is niet heel kort, maar als cadeautje levert ie ook een 'baseUri' property om je stylesheets goed te includen, en een methode om veelzeggende keys aan je uriArgs te hangen:
PHP:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/**
 * urlHandler class for convenient handling of multiviews urls
 * requires PHP >= 4.1.0
 */

class urlHandler {

    var $baseUri;
    var $uriArgs = array();


    /**
     * Constructor
     * Compares the requested url with the path to the script to determine the
     * input parameters that will be stored in array $uriArgs.
     * Also, the string $baseUri will be filled with the full www path to the
     * directory that contains script. This value can be used to solve the 
     * problem of breaking relative paths in pages that use multiviews urls.
     */
    function urlHandler() {

        $docRoot = rtrim($_SERVER["DOCUMENT_ROOT"], '/');
        $httpHost = rtrim($_SERVER["HTTP_HOST"], '/');

        //relative uri to scriptfile
        $relScriptFile = substr($_SERVER["SCRIPT_FILENAME"], strlen($docRoot));

        //strip GET requests from request uri
        $reqUri = ($getPos = strpos($_SERVER["REQUEST_URI"], '?')) ? substr($_SERVER["REQUEST_URI"],0,$getPos) : $_SERVER["REQUEST_URI"];
        
        //find all parts of the requesturi
        $reqUriParts = explode('/', rtrim(urldecode($reqUri),'/') );

        //extract uri args when set
        $sliceOffset = substr_count($relScriptFile, '/');
        if ($sliceOffset < count($reqUriParts)) {
            $this->uriArgs = array_slice($reqUriParts, $sliceOffset);
        }

        //if the first part of the requesturi is the filename (or a multiviews derivate) then it's no input parameter
        $scriptPathParts = pathinfo($_SERVER["SCRIPT_FILENAME"]);
        $scriptIsFirstArg = (       $this->uriArgs[0] == $scriptPathParts['basename'] 
                                ||  $this->uriArgs[0] == basename($_SERVER["SCRIPT_FILENAME"], '.' .$scriptPathParts['extension']) );
        if ($scriptIsFirstArg) {
            array_shift($this->uriArgs);
        }

        //set baseuri
        $scriptDir = substr($relScriptFile, 0, strrpos($relScriptFile,'/')+1);
        $this->baseUri = 'http://' .$httpHost .$scriptDir;
    }


    /** singleton object **/
    function &getInstance() {
        static $instance;
        
        if (!isset($instance)) { $instance = new urlHandler(); }
        
        return $instance;
    }


    /**
     * creates associative entries in the uriArgs array from the arguments
     * passed on to this function
     * Input:  can be either a single array with strings or multiple strings
     * returns: the uriArgs array
     */
    function associateWithUriArgs() {
        $keys = func_get_args();
        if (is_array($keys[0])) {
            $keys = $keys[0];
        }

        foreach ($keys as $key => $value) {
            if (isset($this->uriArgs[$key])) {
                $this->uriArgs[$value] = $this->uriArgs[$key];
            }
        }
        return $this->uriArgs;
    }

}

Regeren is vooruitschuiven

Pagina: 1