site multilingue htaccess avec sous-répertoires, et par défaut 301

j'ai quelques problèmes à configurer mon htaccess pour autoriser plusieurs langues en utilisant la méthode de sous-répertoire eg:

http://www.domain.com/en/
http://www.domain.com/sw/
http://www.domain.com/ie/

aussi pour compliquer les choses, le projet n'est pas actuellement en direct, c'est sur un serveur dev. Par exemple, j'accède actuellement au projet à:

http://dev.domain.com/devname/projectname/

Et je veux le haut automatiquement une redirection 301:

http://dev.domain.com/devname/projectname/en/

Voici mon htaccess:

Options +FollowSymLinks -MultiViews
RewriteEngine on

# ----------------------------------------------------------------------
# MULTI LANGUAGE SUB DIRECTORY
# ----------------------------------------------------------------------

RewriteCond %{REQUEST_URI} !^/(en|sw)/
RewriteRule ^(.*)$ en/ [R=301,L]

# ----------------------------------------------------------------------
# Rewrite rules
# ----------------------------------------------------------------------

## CASE STUDIES ##
RewriteRule ^casestudies/([^/.]+).html$ index.php?controller=contents&method=viewCasestudy&link= [L,QSA]

## PRODUCTS ##
RewriteRule ^products/([^/.]+).html$ index.php?controller=contents&method=viewProduct&link= [L,QSA]

RewriteRule ^([a-z{2}]+)(/)?$ index.php?controller=contents&method=viewHome&lang= [L,QSA] # Default load
RewriteRule ^(/)?$ index.php?controller=contents&method=viewHome [L,QSA] # Default load

ci-dessus va vous rediriger vers:

http://dev.domain.com/home/webserver_dir/devname/projectname/en/

..et si J'utilise RewriteBase il semble que goto...

http://dev.domain.com/en/

ainsi ma question: Comment puis-je obtenir les URLs de langue fonctionnant correctement par rapport au répertoire its Dans sur mon serveur dev, et puis idéalement fonctionnera quand il va en direct sans règles spécifiques à l'environnement.

question Bonus: dois-je ajouter le bit ([A-z{2}]+) devant toutes mes règles de réécriture subséquentes ou Puis-je avoir un catch all qui va affecter toutes les autres règles?

MODIFIER -----------------------------

Je l'ai réduit à ce qui suit comme suggéré...

Options +FollowSymLinks -MultiViews
RewriteEngine on

RewriteBase /devname/projectname/

RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/ [R=301,L]
RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang= [NC,L,QSA] # Default load

... mais maintenant sa redirection http://dev.domain.com/devname/projectname/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/ , des idées?

13
demandé sur Horse 2013-10-24 19:45:39

2 réponses

Avez-vous essayé la réponse dans le lien suivant? Il devrait faire ce que vous voulez réaliser.

Redirection en Boucle par les règles htaccess multi-langue

RewriteEngine On
RewriteBase /   

# empty url -> redirect to en/
RewriteCond %{QUERY_STRING} !lang=(en|de)
RewriteRule ^$ en/ [R=301,L]

# url is ONLY '/en' or '/de' -> redirect to /en/ or /de/ (adding slash)
RewriteRule ^(en|de)$  / [R=301,L]

# now all urls have en/ de/ -> parse them
RewriteRule ^(en|de)/(.*)$  ?lang=&%{query_STRING} [L]
13
répondu melon 2017-05-23 10:30:49

si .htaccess ne doit pas changer

modifier votre <VirtualHost> configuration pour votre DEV server project as

<VirtualHost *:80>
    ServerName dev.domain.com
    ServerAlias project.domain.com
    DocumentRoot "/home/webserver_dir/devname/projectname"
</VirtualHost>

ces modifications vont typiquement dans vos httpd-vhosts.fichier conf . Votre .htaccess les fichiers auraient maintenant

RewriteBase /

de marque root comme de base répertoire pour vos serveurs développement et live .

si vous essayez de mettre en version vos projets ou de tester plusieurs projets sur le même hôte dev , alors vous devrez incorporer le schéma de nommage dans les noms de domaine au lieu du chemin D'URL. Par exemple,

<VirtualHost *:80>
    ServerName dev1.domain.com
    ServerAlias project1.domain.com
    DocumentRoot "/home/webserver_dir/dev1/project1"
</VirtualHost>

<VirtualHost *:80>
    ServerName dev2.domain.com
    ServerAlias project2.domain.com
    DocumentRoot "/home/webserver_dir/dev2/project2"
</VirtualHost>

le fait est que vous ne pouvez pas avoir le même .htaccess fichier de règles de travail intacte avec de déploiement différents répertoires, sauf si vous recourir à la mod-rewrite façon de if-else mumbo jumbo-ce qui pourrait être ajouté encombrement une fois que vous êtes allé vivre.

pour que les règles fonctionnent de manière transparente, Apache doit seulement voir et appliquer les règles sur ce qui se passe live (le contenu qui vient après /devX/projectX/ annuaires) ce qui est ce déplacement de la DocumentRoot fait ici pour nous.

si modification minimale .htaccess sont d'accord

tout le monde n'a pas accès au D'Apache .conf "1519310920 de fichiers". Certains hôtes rejettent à juste titre les demandes de modification. C'est pourquoi, s'ils ont au moins maintenu mod-rewrite activé, beaucoup de paramètres du site web peut être bricolé avec. L'un d'eux est d'utiliser des RewriteBase pour gérer le déploiement différents répertoires.

donc, si vous gardez RewriteBase / sur live mais le remplacer par RewriteBase /devX/projectX/ pour développement , la plupart de vos RewriteRule doit fonctionner comme tel. Ainsi, /devname/projectname/ devrait correctement rediriger vers /devname/projectname/en/ .


Votre utilisation de ([a-z{2}]+) est incorrecte. Vous vouliez probablement dire ([a-z]{2}) pour saisir exactement deux lettres. Si vous vouliez en capturer deux ou plus, il deviendrait ([a-z]{2,}) . Si, votre charge par défaut réécrire deviendrait
RewriteRule ^([a-z]{2})/?$ index.php?controller=contents&method=viewHome&lang= [NC,L,QSA] # Default load

vous avez raison de supposer que vous auriez besoin de ce regex pour toutes les règles suivantes ou elles ne correspondraient pas. Donc, votre RewriteRule pour casestudies ne marchera pas. Une façon plus simple de ne pas se soucier du préfixe de la langue est de laisser tomber le ^ début d'ancrage du chemin D'URL comme

RewriteRule /casestudies/([^/\.]+).html$ index.php?controller=contents&method=viewCasestudy&link= [NC,L,QSA]
RewriteRule /products/([^/\.]+).html$ index.php?controller=contents&method=viewProduct&link= [NC,L,QSA]

Votre dernier RewriteRule matching ^(/)?$ n'est pas nécessaire parce que vous êtes déjà en train de faire une redirection 301 pour toutes les URLs sans préfixe de répertoire de langue vers /en/ ci-dessus, qui devrait idéalement être

RewriteCond %{REQUEST_URI} !^/(en|sw)(/|$) [NC]
RewriteRule ^(.*)$ en/ [R=301,L]

sinon, /en serait redirigé vers /en/en .

4
répondu Ravi Thapliyal 2013-10-28 15:03:49