IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

Remplacer un virtualhost par un htaccess (mutualisé)


Sujet :

Apache

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 98
    Points : 86
    Points
    86
    Par défaut Remplacer un virtualhost par un htaccess (mutualisé)
    Bonjour à toutes et tous,
    Merci d'avoir pris le temps de vous intéresser à mon problème.

    Mes connaissances en htaccess sont basiques et dépassées par un problème que je ne parviens pas à résoudre.
    Pourriez-vous partager avec moi votre expertise sur le sujet s'il vous plait ?

    Le cas
    Je développe un site sous ZF2.
    Il est accessible à l'URL : http://www.creagite.fr

    Toutes les requêtes sont traitées par un fichier index.php présent dans le dossier /public/ de mon serveur.
    En local, en utilisant un virtualhost qui pointe directement vers mon dossier /public/, tout marche à merveille.

    Le problème
    Mon hébergeur actuel (apache) ne me permet pas de paramétrer mes virtualhost.

    mondomaine.fr
    |_ public_html
    |_public
    |_ index.php

    Je tente donc de substituer mon virtualhost par un htaccess pour que mondomaine.fr pointe vers /public_html/public/.


    Solution actuellement mise en place
    J'ai déployé un htaccess dans /public_html/ pour forcer le pointage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Options +FollowSymlinks -Indexes
     
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www.)?monsite.fr$
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /public/$1
     
    RewriteCond %{HTTP_HOST} ^(www.)?monsite.fr$
    RewriteRule ^(/)?$ public [L]

    Problème rencontré avec cette solution
    Toutes mes pages sont désormais accessibles depuis plusieurs URL :
    - www.monsite.fr/mapage
    - www.monsite.fr/public/mapage
    - www.monsite.fr/public/index.php/mapage

    Je souhaiterais bien entendu que seule la première URL soit fonctionnelle, reconnue par mon application comme une route valide.

    Voici le htaccess actuellement déployé dans le dossier public :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Options +FollowSymlinks -Indexes
     
    RewriteEngine On
     
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l
    RewriteRule ^.*$ - [NC,L]
     
    RewriteCond %{REQUEST_URI} !/robots\.txt$ [nocase]
    RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
     
    RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]
    RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] 
     
    SetEnv APPLICATION_ENV production



    Pourriez-vous s'il vous plaît m'aider à retrouver le comportement obtenu grâce aux virtualhost, où une seule URL (non composée de /public/) fonctionne ?
    Merci d'avance pour votre aide.

    Au plaisir de vous lire,
    Omageus

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par omageus Voir le message
    Je souhaiterais bien entendu que seule la première URL soit fonctionnelle, reconnue par mon application comme une route valide.
    Et que voudrais-tu qu'il se passe si on passe par l'une des autres URL ? A mon avis, tu pourras difficilement avoir un meilleur comportement que celui-ci, c'est ce qu'il y a de plus approchant.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 98
    Points : 86
    Points
    86
    Par défaut
    Bonsoir Mac,

    Merci pour ta lecture du sujet.

    Ce qu'il me semble important d'obtenir
    monsite.fr pointe vers ma homepage
    monsite.fr/mapage renvoie vers la page demandée

    Ce que je veux éviter
    monsite.fr/public/ renvoie ma homepage
    monsite.fr/public/mapage renvoie vers ma page
    monsite.fr/public/index.php renvoie ma homepage
    monsite.fr/public/index.php/mapage renvoie ma page

    Toutes ces URL devraient renvoyer une 404, idéalement gérée par mon application.

    Je ne vois vraiment pas comment faire, ça me tracasse.
    Une idée pour que mon cerveau puisse reposer en paix ?

    Merci,
    Omageus

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Y a moyen en s'inspirant de la technique classique de protection contre le hotlinking : on va positionner une variable d'URL spécifique qui va permettre de savoir si les accès aux pages /public/... se font en direct ou bien s'ils sont issus d'une réécriture. Dans le premier cas, la variable sera absente, et on enverra une erreur 404. Ca donnerait ça, dans le .htaccess qui se trouve dans public_html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Options +FollowSymlinks -Indexes
     
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www.)?monsite.fr$
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /public/$1?internal_redirect=1
     
    RewriteCond %{HTTP_HOST} ^(www.)?monsite.fr$
    RewriteRule ^(/)?$ public/?internal_redirect=1 [L]
    
    # Verification des acces directs
    RewriteCond %{REQUEST_URI} ^/public/
    RewriteCond %{QUERY_STRING} !internal_redirect=1
    RewriteRule .* - [R=404,L]
    Après, je ne sais pas comment on pourrait renvoyer une jolie page erreur 404. Peut-être en plaçant les 3 dernières lignes dans le .htaccess du dossier public en réécrivant directement sur l'URL de la page 404 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Verification des acces directs
    RewriteCond %{REQUEST_URI} ^/public/
    RewriteCond %{QUERY_STRING} !internal_redirect=1
    RewriteRule .* URL_vers_page_404 [L]
    Après, faudra t'assurer que la page 404 renvoie bien un statut HTTP 404, quitte à forcer le statut HTTP avec un http_response_code(404); (solution préférée) ou un header("HTTP/1.1 404 Not Found"); dans ton code PHP.

  5. #5
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour,

    Je t'invite à jeter un coup d'oeil à un vieux tutoriel que j'avais écris il y a quelques années maintenant pour du ZF1, mais l'idée des liens symboliques marche sur n'importe quel hébergeur proposant SSH: http://generation-pc.net/tutoriels/z...work-chez-ovh/.

    Quel est ton hébergeur ? Je peux peut-être t'aider plus spécifiquement.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 98
    Points : 86
    Points
    86
    Par défaut
    Mes chers développeurs, merci !

    Je vais tester les solutions mises en avant dès demain (soir).
    Le site est hébergé chez PlanetHoster.

    Très bonne nuit à vous,
    A demain,

    Omageus

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 98
    Points : 86
    Points
    86
    Par défaut
    Bonsoir,

    J'ai réussi à reproduire exactement le comportement recherché en suivant la solution avancée par _Mac_.
    Quelques bidouilles supplémentaires ont été nécessaires pour supprimer les index.php des URL (en suivant le même principe).

    Merci (beaucoup) à vous deux, j'ai fortement apprécié votre aide.
    Très bonnes fêtes.

    Omageus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] Remplacer une chaine par un lien hypertexte
    Par Bisûnûrs dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 09h34
  2. Réponses: 2
    Dernier message: 26/07/2005, 21h44
  3. Réponses: 5
    Dernier message: 30/05/2005, 16h58
  4. Réponses: 2
    Dernier message: 15/03/2005, 15h40
  5. Remplacer plusieurs colonnes par un 'alias'
    Par zestrellita dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/04/2004, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo