6 votes

Alias dynamique Apache basé sur le sous-domaine

Je dispose de la structure suivante dans le cadre d'une application ZF1 -

C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads

J'ai actuellement les serveurs virtuels suivants pour chaque sous-domaine

<VirtualHost *:80>
    DocumentRoot "C:/www/multisite/public"
    ServerName client1.multisite.dev
    Alias /uploads C:/www/multisite/client1/uploads
    FallbackResource /index.php
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "C:/www/multisite/public"
    ServerName client2.multisite.dev
    Alias /uploads C:/www/multisite/client2/uploads
    FallbackResource /index.php
</VirtualHost>

J'aimerais que cela se fasse de manière dynamique en fonction du sous-domaine, mais je ne sais pas comment faire.

{sub_domain}.multisite.dev

conduirait à un alias de

Alias /uploads C:/www/multisite/{sub_domain}/uploads

Est-ce possible ?

1 votes

Je pense que cela est possible en utilisant mod_rewrite pour atteindre la partie sous-domaine. AFAIK alias y aliasmatch ne se préoccupent que de l'URI.

0 votes

Pensez-vous que cela pourrait vous guider ? -> kingcoda.com/how-to-create-wildcard-dns-for-custom-subdomains

6voto

ErikE Points 4616

[EDIT] Comme j'ai testé la solution. Elle fonctionne maintenant comme un rêve comme détaillé ci-dessous. J'avais fait une erreur stupide dans mon regex qui est maintenant corrigée.

L'idée est d'utiliser RewriteCond afin de capturer le fqdn dans la requête et de le diviser. La regex capture la partie la plus à gauche du nom de domaine qui est ensuite référencée dans la RewriteRule en utilisant %1. J'échappe également le public de la traduction, ce qui le rend accessible à l'aide d'un chemin URI commun à tous les fqdn:s mappés sur le site (voir le résultat du test pour un exemple concret).

  • J'ai désactivé le fichier d'hôtes virtuels pour les besoins de cette expérience.
  • Mes points dns client1.multisite.dev y client2.multisite.dev sur mon serveur de test Apache 2.2.
  • Le bout de phrase suivant se trouve dans mon httpd.conf.

.

RewriteEngine On

RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI}        !^/public/
RewriteCond ${lowercase:%{HTTP_HOST}}        ^([^.]+)\.multisite\.dev$
RewriteRule ^/(.*) /myApache/runtime/docs/www/multisite/%1/$1

J'ai créé cette structure de répertoire.

/myApache/runtime/docs/www/multisite/client1/uploads
/myApache/runtime/docs/www/multisite/client2/uploads
/myApache/runtime/docs/www/multisite/public

Chaque répertoire a un fichier séparé appelé index.htm. Le contenu du fichier index.htm révèle le chemin du répertoire où il est placé.

Surfer pour http://client1.multisite.dev/public/index.htm OU à http://client2.multisite.dev/public/index.htm donne ce résultat :

Hi!
Served from /myApache/runtime/docs/www/multisite/public/index.htm 
See you!

Surfer pour http://client1.multisite.dev/uploads/index.htm donne ce résultat :

Hi!
Served from /myApache/runtime/docs/www/multisite/client1/uploads/index.htm 
See you!

Surfer pour http://client2.multisite.dev/uploads/index.htm donne ce résultat :

Hi!
Served from /myApache/runtime/docs/www/multisite/client2/uploads/index.htm 
See you!

J'ai également testé le mélange des cas en entrant l'URL dans mon navigateur web. Tout est traduit en minuscules.

Je note que vous exécutez Apache sous Windows, dont les systèmes de fichiers natifs sont insensibles à la casse. La normalisation de la casse n'est donc pas nécessaire, bien que je trouve personnellement les URL en minuscules plus agréables à regarder dans mon navigateur. Sur les systèmes de fichiers qui sont sensibles à la casse, la normalisation serait une exigence, donc je l'inclus pour compléter.

Enfin, j'ai également noté que l'exécution d'Apache sur un port autre que 80 (c'est-à-dire qu'il faut l'indiquer dans l'url) rompt la référence inverse de RewriteRule. Je n'ai cependant pas cherché de solution à ce problème.

J'espère que cela correspond ou s'approche suffisamment de ce dont vous avez besoin.

0 votes

Merci. Je ne sais pas pourquoi je n'avais pas utilisé cette approche en premier lieu. Pour une raison quelconque, j'étais bloqué sur l'utilisation des alias. Je ne l'ai pas encore essayé mais c'est certainement la solution la plus simple.

0 votes

Je me sens mal de ne pas avoir le temps de tester cela en raison de la tonne de travail (par exemple, je note que j'ai manqué l'échappement des points dans la regex rewritecond), mais jusqu'à ce que je puisse, il y a beaucoup de ressources avec des exemples et des variations à googler. Par exemple : httpd.apache.org/docs/2.4/rewrite/vhosts.html y vicvijayakumar.com/2013/01/16/mass-virtual-hosting-in-apache et ainsi de suite.

0 votes

@nnichols Avez-vous déjà essayé ça ? Comment ça s'est passé ?

4voto

denis21 Points 41

Essayez le mod_vhost_alias : http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html Beispiel:

<VirtualHost *:80>
    ServerName apps.mydomain.ltd
    ServerAlias *.apps.mydomain.ltd
    VirtualDocumentRoot /web/mydomain.ltd/apps/%1/public_html
    CustomLog /web/mydomain.ltd/access_apache.log vhost_log_format
    ErrorLog /web/mydomain.ltd/logs/error_apache.log
    ServerAdmin support@mydomain.ltd    
    <Directory "/web/mydomain.ltd/apps">
        Options FollowSymLinks
        Order allow,deny
        Allow from all
        AllowOverride All
    </Directory>
</VirtualHost>

1 votes

Merci d'avoir pris le temps de faire votre suggestion mais cela ne résoudrait pas mon problème. Elle permet d'utiliser VirtualScriptAlias mais pas VirtualAlias.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X