Partage
  • Partager sur Facebook
  • Partager sur Twitter

[RESOLU]Apache mod_rewrite redirection unique

Problème des dossiers et fichiers lorsque redirigé

    9 juillet 2019 à 17:30:58

    Bonjour,

    Je suis en train de "péter" un cable, je crois que je n'ai jamais eu aussi mal à ma tête !!! (la fatigue n'aide pas)

    Je vous montre mon .htaccess, pourtant si simple :

    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /default/
    RewriteCond %{REQUEST_URI} ^.*$
    RewriteRule ^(.*)$ main.php?link=$1 [END,QSD]#le QSD n'est peut être pas nécessaire, mais là je n'ai plus la force de réfléchire



    Et je ne sais pas pourquoi, quand je recherche http://site.com/main.php (le fichier utilisé pour la réception du GET), il me met une erreur 404 au lieu de la page (/main.php?link=main.php) !

    Mets ce qui ma le plus retourné la tête, c'est quand je tape du genre http://site.com/test , qui est le nom d'un dossier existant au même niveau que /default/ (RewriteBase) et bien ce malade me modifie mon URL vers /test/?link=test , il c'est crut tout permis, c'est comme si je rentrais dans un magasin et que je rangeais tout comme bon me semble.

    En gros :

    - Quand le Fichier de réception est le même que celui de l'URL demandée, la rewrite ne fonctionne pas (/main.php devrait donner /main.php (avec $_GET['link']=>'main.php'), mais donne 404)

    - Quand on demande un Dossier (sans le slash / !) existant (qui est au même niveau que le dossier de base), alors il redirige /?link=dossier (/test devrait donner /test (avec $_GET['link']=>'test'), mais donne /test/?link=test (avec $_GET['link']=>'test/')), pourquoi le réécrire comme ça !!!

    Désoler de la présentation médiocre, mais là je vais rentrer chez moi et faire un bon resident evil, histoire de calmer les pulsion douloureuses dans mon cerveau !

    Bien à vous.

    P.S : Je ne suis pas sûr pour la catégorie choisie et le titre, le sous titre du sujet.

    AJOUT :

    - Pour le dossier, cela le fait aussi avec le dossier Rewritebase (/default devient /default/?link=default)

    - Si je change le paramètre "link" de l'URL (/default/?link=default) => (/default/?link=def), cela ne change rien ($_GET['link']=>'default')

    - Pour le dossier je pense que c'est Apache qui modifie automatiquement l'URL quand il tombe sur un nom de dossier sans "/", il le rajoute. Mais comment enlever cette option ou la contourner ?

    --------------

    SOLUTION :

    - Pour la redirection des dossiers, il suffit de la desactiver du module "dir" de Apache avec la directive "DirectorySlash Off" (Peut être une faille de sécurité dans certains cas)

    Pour en savoir plus, voir : https://httpd.apache.org/docs/2.4/fr/mod/mod_dir.html#DirectorySlash

    - Pour le fichier "main.php", qui est le fichier finale et qui renvoie une erreur 404, quand on l'appel => j'ai trouvé ceci :

    RewriteCond %{REQUEST_URI} ^/?main.php$
    RewriteRule . /404 [L]

    Ce qui donne quand on appel "/main.php" : /main.php (avec $_GET['link']=>'404')
    Un peu comme si on avait appelé l'URL /404 directement

    AU FINAL :

    Options +FollowSymlinks -Indexes
    DirectorySlash Off
    RewriteEngine On
    RewriteBase /default/
    RewriteCond %{REQUEST_URI} ^/?main.php$
    RewriteRule . /404 [L]
    RewriteCond %{REQUEST_URI} ^.*$
    RewriteRule ^(.*)$ main.php?link=$1 [END,QSD]


    - Options +FollowSymlinks -Indexes => (+FollowSymlinks) sert à suivre les liens symboliques et (-Indexes empêche la possibilité d'indexer les dossier et donne une alerte 403 Forbidden)

    - DirectorySlash Off => Empêche la redirection des URL avec le nom d'un dossier sans le / à la fin (/dossier ne devient pas /dossier/)

    - RewriteEngine On => Active la réécriture d'URL

    - RewriteBase /default/ => Défini la base à utiliser pour rechercher l'URL (si réécrite, (base /base/) alors URL /test.php recherchera /base/test.php)

    - RewriteCond %{REQUEST_URI} ^/?main.php$ => Permet la réécriture seulement si l'URL est "main.php"

    - RewriteRule . /404 [L] => Si la condition précédente est vraie, dans ce cas il modifi l'URL "main.php" en "404" et [L] sert à continuer les réécritures

    - RewriteCond %{REQUEST_URI} ^.*$ => Permet la réécriture pour toutes les URL

    - RewriteRule ^(.*)$ main.php?link=$1 [END,QSD] => Si la condition précédente est vraie, dans ce cas il accepte toutes URL et la modifi en "main.php?link=" plus l'URL (la class (.*) trouvé avec le pattern de la regex), [END] sert à terminer la réécriture et [QSD] Supprime toute chaîne de paramètres de l'URL entrante, dans ce cas ne sert peut être pas, mais dans le doute.


    ASTUCE :

    - Mettez en négatif l'option "Indexes" dans le .conf de votre site, généralement dans "/etc/apache2/sites-available/" :

    Options -Indexes
    
    #EXEMPLE DE CODE :
    <Directory "/var/www/project/">
     AllowOverride all
     Require all granted
     Options +FollowSymlinks -Indexes
    </Directory>

    Ce qui permet d'interdire l'accès à un dossier quand le .htaccess n'est pas disponible et que vous n'avez pas de "index.php" ou autre.


    LIEN :

    - mod_rewrite : https://httpd.apache.org/docs/2.4/fr/mod/mod_rewrite.html

    - mod_dir : https://httpd.apache.org/docs/2.4/fr/mod/mod_dir.html


    En espérant avoir put aider certains, en tout cas ça ma aider moi ;) Go dans les favoris

    -
    Edité par Accraugaming 10 juillet 2019 à 12:51:33

    • Partager sur Facebook
    • Partager sur Twitter

    [RESOLU]Apache mod_rewrite redirection unique

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    • Editeur
    • Markdown