6
votes

Apache mod_rewrite un sous-domaine à un sous-dossier (via Redirect interne)

J'essaie d'écrire un ensemble de règles mod_rewrite permettant à mes utilisateurs d'utiliser un seul dossier pour faire du développement sur différents projets, et ne pas avoir à gaver avec l'ajout de Vhosts pour chaque projet.

Mon idée d'accomplir Cela, est de mettre en place un "Vhost global" pour chaque utilisateur qui a besoin de cette capacité (seulement 3-4), le Vhost serait quelque chose comme: .My-domain.com. De là, je souhaite promouvoir mes utilisateurs pour écrire du code comme s'il s'agissait d'un domaine et non dans un sous-dossier. Par exemple, si Bob travaillait sur un projet nommé «Gnome», j'aimerais que l'URL Bob (et toute autre personne sur notre réseau interne) se charge d'accéder à ce projet pour être: http://gnome.bob.my-domain.com . Mais, ce que j'aimerais que Apache soit fait, est reconnue que "Gnome" est un "projet" et caraper la demande de la demande, en interne, de bob.my-domain.com/gnome/.

Le code de réécriture MOD que j'ai est: p>

[rid#838dc88/initial] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/index.html -> index.html
[rid#838dc88/initial] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'index.html'
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^.]+)\.bob\.my-domain\.com' => matched
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='/index.html' pattern='!^/%1.*' => matched
[rid#838dc88/initial] (2) [perdir /home/bob/http/] rewrite 'index.html' -> '/gnome/index.html'
[rid#838dc88/initial] (1) [perdir /home/bob/http/] internal redirect with /gnome/index.html [INTERNAL REDIRECT]
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/gnome/index.html -> gnome/index.html
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'gnome/index.html'
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^\.]+)\.bob\.my-domain\.com' => matched
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='/gnome/index.html' pattern='!^/%1.*' => matched
[rid#8392f30/initial/redir#1] (2) [perdir /home/bob/http/] rewrite 'gnome/index.html' -> '/gnome/gnome/index.html'
[rid#8392f30/initial/redir#1] (1) [perdir /home/bob/http/] internal redirect with /gnome/gnome/index.html [INTERNAL REDIRECT]
[rid#8397970/initial/redir#2] (3) [perdir /home/bob/http/] add path info postfix: /home/bob/http/gnome/gnome -> /home/bob/http/gnome/gnome/index.html


1 commentaires

Ajout de plus d'informations des journaux de réécriture, j'espère que quelqu'un a essayé cela avant, ou a une contribution sur la façon dont je peux le faire! Merci gars (et gals)


4 Réponses :


0
votes

quelques questions: strud>

Vous avez dit "carte en interne" - ne voulez pas utiliser de redirection? p>

Utilisez-vous le même virtualhost pour gnome.bob.mysite.com code> et bob.mysite.com code> p>

Avez-vous pensé à créer un serveuralias pour *. BOB.MYSITE.COM ? p>

p>

Voici une version approximative que vous pourriez modifier pour travailler. Il capturera le sous-domaine et l'URL demandée et fera rediriger le domaine principal avec le sous-domaine comme première partie du chemin, suivi du chemin demandé, suivi de la chaîne de requête. P>

ServerName www.mysite.com
ServerAlias *.mysite.com

RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9-]+)\\.mysite.com$
RewriteRule ^/(.*)       http://www.mysite.com/%1/$1        [R=301,L]',    


1 commentaires

Je veux absolument une redirection interne. L'ensemble de cela est de pouvoir utiliser des chemins absolus sur des liens, CSS, IMG SRCS, etc. Il y a / sera un hôte virtuel pour .My-site.com avec un alias pour *. .My-Site.com, donc tout domaine demandé de .My-site.com ou ci-dessous sera ramassé par ce vhost



0
votes

Avez-vous essayé d'utiliser une autre règle de réécriture pour traiter celui-ci avant cela? XXX

Mais je pense que votre plus grand problème est le fait que votre serveur ne comprend pas qu'il est servi sous un Nom différent.

Il pense qu'il est en cours d'exécution dans le gnome / gnome tandis que les choses du navigateur utilisées dans le répertoire /. Donc, toute URL relative que vous allez causer des problèmes.

Ce dont vous avez besoin est un filtre qui exécutera toutes les URL de votre page via un processeur et les modifiera de / gnome / à / à / à /.<< p>


2 commentaires

L'idée est de décourager les URL relatives, mais sous cette structure, ils devraient également travailler.


En outre, je suis assez sûr que l'hôte HTTP n'est pas utilisé dans la rédregle, juste l'URI



1
votes

Vous voudrez peut-être vérifier

http: //httpd.apache .org / docs / 2.2 / vhosts / masse.html p>

Il traite du problème de la documentation à laquelle vous connaissez. p>

règle va quelque chose comme ça P>

VirtualDocumentRoot /var/www/%1/


0 commentaires

5
votes

Après quelques années d'ignorer ce problème et de revenir à des points à différents endroits, j'ai enfin trouvé une solution viable. XXX

Ce que j'ai trouvé était que les références de retour pour le précédent Réécritecond Les instructions ne sont pas disponibles dans le paramètre ConditionPattern des réédérations futures. Si vous souhaitez utiliser une référence arrière à partir d'une directive précédente Rewritecond , vous ne pouvez l'utiliser que dans le paramètre teststring.

Les directives ci-dessus prépendent le sous-domaine correspondant à la 1er réécritecond directive sur le demandeur, délimité par :: . Ce que nous faisons alors dans la chaîne de test Rewritecond (regex) est relancement du nom du sous-domaine, puis vérifiez que notre demande réel ne commence pas avec ce sous-domaine en tant que dossier utilisant Une référence arrière dans la même regex.

Cela semble beaucoup plus déroutant que ce qu'il n'en est vraiment, et je ne peux pas prendre le crédit pour découvrir la réponse. J'ai trouvé la réponse comme une réponse à une autre question ici, % N BACKREFERATION INS REWRITECOND . Merci à Jon Lin pour répondre à cette question, et inconnue de lui, ma question aussi!


1 commentaires

Juste une note que j'ai dû supprimer la fuite / sur la deuxième réécriture pour le faire fonctionner correctement pour moi. J'ai pu charger mon URL avec elle (une installation de la galerie3), mais les ressources CSS ne se chargeaient pas correctement. Enlever la barre oblique de fin corrigée. On dirait que c'était fini avec // dans l'URL avec elle là-bas.