2010-10-26 7 views
3

J'ai le problème suivant. Nous avons utilisé plusieurs URL différentes sur la même page. Maintenant, nous voulons utiliser une seule URL pour ces pages. Voici un exemple:Effectuer une réécriture 301 à partir d'un dossier en utilisant des URL de réécriture relatives

RewriteRule ^(subfolder1/folder1/|(subfolder2|subfolder3)/folder2/|folder3/)?(name1|name2|name3|name4)$ scriptname.php [QSA,NC] 

Comme vous pouvez le voir, c'est assez salissant. Ce que je veux maintenant faire est la suivante: Réécrire toutes les URL à une seule de ces URL (par exemple sous-dossier1/dossier1/nom1) en utilisant un 301 et d'utiliser une réécriture sur cette URL pour adresser le script réel. Il pourrait ressembler à ceci:

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC] 
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC] 

Jusqu'à ici, je n'ai pas de problème. Mais maintenant vient la partie délicate. Nous utilisons plusieurs machines de développement sur des machines UNIX et Windows. Ils ont tous des noms d'hôtes et des dossiers différents. Voici quelques exemples:

http://www.example.com (production) 
http://test.example.com (testing) 
http://localhost/development_folder/ (development WIN) 
http://localhost:8888/development_folder/ (development MAC) 

La question est que nous avons des sous-dossiers sur les machines de développement, je ne peux pas utiliser une URL absolue /subfolder1/folder1/name1/ comme il le ferait par exemple pointez sur http://localhost/subfolder1/folder1/name1/ et non sur http://localhost/development_folder/subfolder1/folder1/name1/ afin que toutes les réécritures soient interrompues sur les machines de développement.

Y a-t-il une chance que ce problème fonctionne? Comme le dossier development_folder est le même sur toutes les machines de développement, serait-il aider à exclure/inclure ce dossier aux réécritures ensuite comme ceci:

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /development_folder/subfolder1/folder1/name1 [R=301,QSA,NC] 
RewriteRule ^development_folder/(.*)$ $1 [QSA.NC] 
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC] 

Ou est-il une meilleure façon de le faire? Tout indice aiderait beaucoup.

Répondre

1

J'utiliser Apache Les directives d'inclusion pour modifier l'ensemble de règles. De cette façon, je peux tester les règles qui seront utilisées en production. Je ne me souviens pas s'il y a un problème avec la résolution du caractère générique include pour n'inclure aucun fichier, mais s'il y en a, vous pouvez utiliser un fichier vide en production et les règles de réécriture actuelles en dev.

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC] 
Include /etc/apache/conf.d/*_dev.rewrites 
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC] 

Sur vous dev machines et uniquement sur votre machine dev ont les /etc/apache/conf.d/my_dev.rewrites:

RewriteRule ^development_folder/(.*)$ $1 [QSA.NC] 
+0

OK, et si j'ai diffrent machines DEV (MAC et Windows) puis-je utiliser une instruction avant le "Include" pour gérer cela? Je ne suis pas très familier avec les fichiers Apache. – 2ndkauboy

+0

BTW: Désolé d'être en retard avec mon upvote donc vous n'avez pas reçu la prime. J'ai donc augmenté de 10 vos réponses pour vous donner la bonne récompense :) – 2ndkauboy

+0

Vous pouvez avoir mac_dev.rewrites et windows_dev.rewrites sur la même machine ou sur des machines différentes. Ils vont tous les deux être attirés. – dietbuddha

0

Les rewriteRules par répertoire (à l'intérieur d'un .htaccess) ne fonctionneraient-ils pas? Vous pouvez ensuite spécifier soit une substitution relative (sans a/en avant) ou, au cas où vous en auriez besoin, une substitution absolue (avec /).

Avec le relatif, le chemin de base sera supprimé avant d'être réécrit puis préfixé à nouveau. Peut-être, vous devrez régler RewriteBase pour que cela fonctionne correctement (hmm, différemment pour vos différents serveurs ...).

0

Je pense qu'il y a un problème plus profond avec cette mise en page de serveurs de dev/production mais je suppose que vous avez vos raisons. Cela peut vous aider:

# dev 
RewriteCond %{HTTP_HOST} ^localhost$ [NC] 
RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC] 
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC] 

# production 
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC] 
RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /dev_folder/subfolder1/folder1/name1 [R=301,QSA,NC] 
RewriteRule ^dev_folder/subfolder1/folder1/name1$ script.php?dev=1 [QSA.NC] 

L'idée est d'utiliser le nom d'hôte d'avoir un ensemble de règles différentes. Vous pouvez utiliser dev1.example.com, dev2.example.com, etc, au besoin en ajoutant que les domaines « faux » à /etc/hosts alias de 127.0.0.1