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 :

Fichier .htaccess et sous-domaine


Sujet :

Apache

  1. #1
    Invité
    Invité(e)
    Par défaut Fichier .htaccess et sous-domaine
    Bonjour,

    J'espère poster au bon endroit mais je n'en suis pas sûr. Merci de déplacer mon message s'il est mieux ailleurs.

    J'essaye de rajouter un sous-domaine à mon site internet afin d'avoir par exemple "http://fr.monsite.net/index.php" au lieu de "http://www.monsite.net/fr/index.php". Le sous-domaine a été ajouté par mon hébergeur.

    Pour le moment "http://www.monsite.net/fr/index.php" redirige vers "http://www.monsite.net/index.php?pw=fr" grâce au htaccess.

    Le fichier htaccess dans le répertoire fr est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteEngine on
    RewriteRule ([a-z].*).php ../$1.php?pw=fr [L]
    RewriteRule ([a-z].*) ../$1
    Le 1er RewriteRule est pour les pages php et le 2ème pour les fichiers autres que les fichier *.php (tout les fichiers commencent par une lettre minuscule)

    Par contre "http://fr.monsite.net/index.php" fait une belle erreur 500
    J'ai fait un test avec le fichier htaccess suivant et là ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteEngine on
    RewriteRule ([a-z].*).php http://www.monsite.net/$1.php?pw=fr [L]
    Par contre j'affiche par exemple l'adresse "http://www.monsite.net/index.php?pw=fr" dans le navigateur.

    J'ai un peu de mal avec les fichiers htaccess donc je fais sans doute des erreurs. Que faut-il mettre dans le htaccess pour que "http://fr.monsite.net/index.php" redirige vers "http://www.monsite.net/index.php?pw=fr" et qu'il affiche bien "http://fr.monsite.net/index.php" dans le navigateur ?

    J'ai aussi 2 autres questions pour améliorer la 1ère version:
    1) Mon 1er htaccess est-il bien adapté ou peut-il être amélioré pour les images et fichiers css qui sont utilisé comme ceci dans le fichier php ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <link rel="icon" type="image/png" href="./image/icone.png" />
        <link rel="stylesheet" type="text/css" href="style.css" />
        <link rel="stylesheet" type="text/css" href="menu.css" />
    2) J'avais mis en plus du fichier htaccess un fichier index.php dans le répertoire fr pour ne pas avoir de problème lorsqu'on essaye d'afficher "http://www.monsite.net/fr/" sinon cela faisait une erreur 404. N'y a-t-il pas plus simple.

    Merci d'avance.

  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
    Ton premier .htaccess part dans la bonne direction mais il est incomplet. En fait, la seconde règle est toujours appliquée contrairement à ce qu'on pourrait croire notamment à cause du flag L dans la première règle. C'est parce qu'Apache ne joue pas qu'une seule fois les règles ; il les joue autant de fois que nécessaire jusqu'à arriver à une URL qui n'est plus réécrite. Dans ton cas, le rejeu des règles active systématiquement la seconde règle.

    Pour bloquer clairement la règle 2 et faire en sorte qu'elle ne s'active que pour les fichiers non PHP, il faut ajouter une condition juste avant cette règle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_URI} !\.php$

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci.
    Je viens de faire un test, ça ne rajoute pas de bug C'est donc changé.

    Mais pourquoi cette ligne bloque la règle 2?
    Si l'adresse est "http://www.monsite.net/fr/index.php", REQUEST_URI correspond bien à "/index.php" ? Et on le compare bien à .php ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_URI} !\.php$
    J'ai vraiment du mal avec les redirection ... Il va falloir que je me plonge dans une bonne documentation pour tout comprendre

    Concernant la dernière question, il doit faire un 404 car il ne trouve ni "index.html", ni "index.php" dans le dossier.
    Je me demandais s'il n'était pas possible de faire une règle redirigeant le "http://www.monsite.net/fr/index.html" ou "http://www.monsite.net/fr/index.php" vers "http://www.monsite.net/index.php" ?

  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
    J'avoue ne rien avoir compris à tes explications et ta dernière question me semble être la même que la question initiale

    Bref, si je reprends à ma sauce, j'ai le .htaccess suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    RewriteEngine on
     
    # Remplacer les ... ci-dessous par la liste des codes de langue supportés
    RewriteRule (fr|en|...)/([a-z].*)\.php$ ../$2.php?pw=$1 [L]
     
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ([a-z].*) ../$1 [L]
     
    # Pour les sous-domaines
    # Remplacer les ... ci-dessous par la liste des codes de langue supportés
    RewriteCond %{HTTP_HOST} ^(fr|en|...)\.monsite\.net
    RewriteRule ([a-z]*)\.php /$1.php?pw=%1 [L]

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    J'avoue ne rien avoir compris à tes explications et ta dernière question me semble être la même que la question initiale

    Bref, si je reprends à ma sauce, j'ai le .htaccess suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    RewriteEngine on
     
    # Remplacer les ... ci-dessous par la liste des codes de langue supportés
    RewriteRule (fr|en|...)/([a-z].*)\.php$ ../$2.php?pw=$1 [L]
     
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ([a-z].*) ../$1 [L]
     
    # Pour les sous-domaines
    # Remplacer les ... ci-dessous par la liste des codes de langue supportés
    RewriteCond %{HTTP_HOST} ^(fr|en|...)\.monsite\.net
    RewriteRule ([a-z]*)\.php /$1.php?pw=%1 [L]
    Ben si je vais sur ""http://www.monsite.net/fr" le serveur va chercher le fichier "http://www.monsite.net/fr/index.html" et redirige vers "http://www.monsite.net/index.html" et fini en erreur car il n'existe pas. Mais en fait c'est une erreur 403 donc c'est pas ça ...

    En tout cas si je rajoute ceci dans le htaccess ça ne me fait pas d'erreur 403 et affiche la bonne page mais en indiquant l'adresse complete ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule index.html http://www.monsite.net/index.php?pw=fr [L]
    Ton htaccess ne fonctionne pas
    Forbidden

    You don't have permission to access / on this server.

    Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
    Tu n'avais pas dit que la ligne suivante permettait de ne pas faire la suite?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_URI} !\.php$
    Donc pourquoi tu l'utilise puis plus loin tu utilises "RewriteRule" avec un fichier se finissant par php ?


    Mais vu que c'est une erreur Forbidden (donc 403) le problème viens peut être d’ailleurs ?

    Pour précision (c'est peut être utile), le fichier htaccess se trouve dans le sous-répertoire fr

    [Edit] Si je met ça dans le htaccess du répertoire fr, la redirection fonctionne dans ce sens sans erreur "http://fr.monsite.net/index.php" => "http://www.monsite.net/de/index.php"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RewriteEngine on
    RewriteRule (.*).php http://www.monsite.net/de/$1.php [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule (.*) http://www.monsite.net/$1 [L]
    Bon par contre "http://fr.monsite.net/" renvoie vers ""http://www.monsite.net/"
    Dernière modification par Invité ; 29/03/2013 à 00h01.

  6. #6
    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 Beginner.j Voir le message
    En tout cas si je rajoute ceci dans le htaccess ça ne me fait pas d'erreur 403 et affiche la bonne page mais en indiquant l'adresse complete ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule index.html http://www.monsite.net/index.php?pw=fr [L]
    C'est normal, c'est parce que tu as mis http://... dans le second paramètre de RewriteRule. Si tu le retires et après purge du cache du navigateur, ça devrait aller mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule index.html /index.php?pw=fr [L]
    Citation Envoyé par Beginner.j Voir le message
    Tu n'avais pas dit que la ligne suivante permettait de ne pas faire la suite?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_URI} !\.php$
    Non, j'ai dit que ça bloquait la règle 2. Relis la doc Apache : les RewriteCond servent à conditionner la RewriteRule qui se trouve immédiatement après, elles n'ont pas de portée "globale", elles ne s'appliquent qu'à une seule règle (RewriteRule). C'est pour ça que je la met une seconde fois.


    Citation Envoyé par Beginner.j Voir le message
    Pour précision (c'est peut être utile), le fichier htaccess se trouve dans le sous-répertoire fr
    Ca change tout : j'avais écrit mon .htaccess en supposant qu'il se trouvait à la racine du site, d'où les (fr|en|...). Si c'est dans le répertoire fr, ce filtre n'a absolument aucun intérêt.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    C'est normal, c'est parce que tu as mis http://... dans le second paramètre de RewriteRule. Si tu le retires et après purge du cache du navigateur, ça devrait aller mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule index.html /index.php?pw=fr [L]
    Erreur 403 s'il n'y a aucun fichier "index.php" dans le répertoire "fr" alors que le htaccess a la modification que tu indiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RewriteEngine on
    RewriteRule ([a-z].*).php ../$1.php?pw=fr&dis=no [L]
    RewriteRule index.html /index.php?pw=fr&dis=no [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ([a-z].*) ../$1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RewriteEngine on
    RewriteRule ([a-z].*).php ../$1.php?pw=fr&dis=no [L]
    RewriteRule index.html ../index.php?pw=fr [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ([a-z].*) ../$1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RewriteEngine on
    RewriteRule ([a-z].*).php ../$1.php?pw=fr&dis=no [L]
    RewriteRule index.html index.php?pw=fr&dis=no [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ([a-z].*) ../$1
    Pourtant ça fonctionne bien sans fichier "index.php" dans le répertoire "fr" avec le fichier htaccess suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RewriteEngine on
    RewriteRule ([a-z].*).php ../$1.php?pw=fr&dis=no [L]
    RewriteRule index.html http://www.monsite.net/index.php?pw=fr [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule ([a-z].*) ../$1
    Citation Envoyé par _Mac_ Voir le message
    Non, j'ai dit que ça bloquait la règle 2. Relis la doc Apache : les RewriteCond servent à conditionner la RewriteRule qui se trouve immédiatement après, elles n'ont pas de portée "globale", elles ne s'appliquent qu'à une seule règle (RewriteRule). C'est pour ça que je la met une seconde fois.
    Ben il n'y avait que 2 règle donc je ne pouvais pas le deviner.
    SI tu as un bon lien vers la doc apache concernant les RewriteCond et les RewriteRule je suis preneur. J'ai regardé les 3 tuto disponible sur developpez (comme http://g-rossolini.developpez.com/tu...eecriture-url/) mais il n'y a quasiment rien expliquant exactement ce que ça fait. Il y a juste un exemple de base que je maitrise déjà ...
    [Edit]Peut être cette doc que tu as cité dans un autre post du forum? http://httpd.apache.org/docs/2.2/rew...gs.html#flag_p[/Edit]

    Citation Envoyé par _Mac_ Voir le message
    Ca change tout : j'avais écrit mon .htaccess en supposant qu'il se trouvait à la racine du site, d'où les (fr|en|...). Si c'est dans le répertoire fr, ce filtre n'a absolument aucun intérêt.
    C'est que mon hebergeur redirige le "fr.monsite.net" vers "www.monsite.net/fr"
    De quel filtre parles-tu que les (fr|en|...) sont à 2 endroits?

    Il n'y a pas moyen d'afficher le répertoire courant avant de faire la redirection (comme un mode debug) ? Ca pourra aider à résoudre mon problème car j'ai l'impression avec certains tests qu'il essaie d'aller à la racine (il indique "/" )
    Dernière modification par Invité ; 31/03/2013 à 08h01.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Mon hébergeur redirige le "fr.monsite.net" vers "www.monsite.net/fr" (c'est comme ça qu'il crée les sous-domaine)

    J'ai testé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RewriteEngine on
    RewriteRule (.*).php $1.php?pw=fr [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule (.*) $1 [L]
    Il va bien chercher les fichiers dans le répertoire fr car si j'y met un index.php il le voit et l'affiche (sans les icônes)
    Idem avec la dernière ligne modifiée comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule (.*) ../$1 [L]
    Avec le htaccess suivant il affiche correctement les icônes de la page index.php.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RewriteEngine on
    RewriteRule (.*).php $1.php?pw=fr [L]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule (.*) http://www.monsite.net/$1 [L]
    Bon par contre si je vais sur "fr.monsite.net" sans indiquer de fichier php ou html il me renvoie vers "www.monsite.net". Ce qui est normal vu que la 1ère règle ne s'applique pas donc il passe à la 2ème.
    J'avais pensé à faire une règle avec "index.html" ou "^$" mais ça ne marche pas. Que faudrait-il mettre?

    Sinon pour résumer mon problème principal:
    "fr.monsite.net" redirige vers "www.monsite.net/fr" (via l’hébergeur, je ne sais pas comment il fait)
    Le htaccess de "www.monsite.net/fr" devrait rediriger vers "www.monsite.net" avec "../$1" mais ne le fait pas correctement. Il ne le fait que si on utilise directement "www.monsite.net/fr" et pas avec "fr.monsite.net"

  9. #9
    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
    A priori, tu ne peux pas lutter : fr.monsite.net et www.monsite.net sont a priori 2 hôtes virtuels différents avec chacun leur document root, même si l'un est un sous-répertoire de l'autre. fr.monsite.net pointe directement sur le répertoire fr, ce qui fait que ../ ne correspond à rien pour ce site. Si ton hébergeur a un support, contacte-le.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    A priori, tu ne peux pas lutter : fr.monsite.net et www.monsite.net sont a priori 2 hôtes virtuels différents avec chacun leur document root, même si l'un est un sous-répertoire de l'autre. fr.monsite.net pointe directement sur le répertoire fr, ce qui fait que ../ ne correspond à rien pour ce site. Si ton hébergeur a un support, contacte-le.
    C'est ce que j'ai fait samedi dernier. Mais comme ils ne travaillaient pas lundi il va falloir attendre un peu.

    Je me disait qu'au pire je pouvais faire ceci:
    - dupliquer les pages php dans chaque répertoire (ça me permettra d'avoir de plus grande différence entre les différentes version)
    - faire une règle uniquement pour les images, script et fichier css en indiquant dans ce cas le chemin complet.

    Cette règle devrait suffire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule (.*) http://www.monsite.net/$1
    Par contre serait-il possible de mettre une condition pour exclure un sous-répertoire (ex: monsite.net/fr/image_fr) dans ces règles?

    En tout cas, merci pour ton aide. Je te tiens au courant quand j'aurais la réponse.

  11. #11
    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 Beginner.j Voir le message
    Par contre serait-il possible de mettre une condition pour exclure un sous-répertoire (ex: monsite.net/fr/image_fr) dans ces règles?
    Bah oui, ça s'écrit comme tu l'exprimes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_URI} !^/fr/image_fr
    Franchement, tu aurais pu/dû trouver tout seul...

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Bah oui, ça s'écrit comme tu l'exprimes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_URI} !^/fr/image_fr
    Franchement, tu aurais pu/dû trouver tout seul...
    Donc comme ça (fr entre parenthèse pour gérer le fr.monsite.net + le monsite.net/fr )?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/(fr/)?image_fr [OR]
    RewriteCond %{REQUEST_URI} !\.php$
    RewriteRule (.*) http://www.monsite.net/$1
    Je ne connais pas trop les conditions multiples ...

    [Edit]Réponse de l'hébergeur

    Quand votre navigateur appelle "http://fr.monsite.net" il n'y a pas de dossiers "../", vu que l'uri est "/" ; la rewrite se réécrit donc sur elle-même et boucle, d'ou l'erreur 500. Dans "http://www.monsite.net/fr", l'uri est "/fr" donc on a un "../" pour revenir à "/" et ça ne boucle pas.

    En principe si vous supprimez votre dossier "/web/fr/" (en ftp) son sous-domaine fr.monsite.net sera redirigé directement sur la racine ("/web/") et donc il arrivera directement pour "http://fr.monsite.net" dans le même dossier que "http://www.monsite.net", sans devoir s'ennuyer avec une rewrite.
    Effectivement, ça ne boucle pas. Par contre je perd le paramètre ("?pw=fr" )lors de la redirection que j'utilise dans quasiment toutes les pages php.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    switch ($pw) {
    case 'fr':
      include('./data-fr.php');
      break;
    default:
      include('./data-autre.php');
      break;
    }
    ?>
    Et surtout ceux qui venaient sur "http://www.monsite.net/fr" vont avoir une belle erreur 404

    Je vais donc plutôt partir sur la solution de dupliquer les fichiers php et de rediriger les autres fichiers. C'est peut être un peu plus lourd à gérer mais ça me permettra d'avoir des versions différentes suivant le répertoire.
    Dernière modification par Invité ; 04/04/2013 à 08h35.

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

Discussions similaires

  1. Architecture de fichiers, htaccess et sous domaine
    Par biibox dans le forum Apache
    Réponses: 2
    Dernier message: 24/03/2012, 09h12
  2. [.htaccess] Accès sous-domaine
    Par Blinkers dans le forum Apache
    Réponses: 3
    Dernier message: 18/10/2011, 22h17
  3. htaccess et sous-domain
    Par gotcha5832 dans le forum Apache
    Réponses: 8
    Dernier message: 13/07/2011, 19h09
  4. Réponses: 1
    Dernier message: 26/01/2009, 19h55

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