Frage Apache dynamischer Alias ​​basierend auf Subdomain


Ich habe die folgende Struktur als Teil einer ZF1-Anwendung -

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

Ich habe derzeit den folgenden vhost für jede Sub-Domain -

<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>

Ich möchte das dynamisch basierend auf der Subdomain erreichen, aber ich kann nicht herausfinden, wie es geht.

{sub_domain}.multisite.dev

würde zu einem Alias ​​von führen

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

Ist das möglich?


5
2017-11-24 21:16


Ursprung


Ich glaube, das ist mit mod_rewrite möglich, um an den Subdomain-Teil zu kommen. so viel ich weiss alias und Entschuldigung sich nur mit der URI befassen. - ErikE
Denkst du, das könnte dich führen? -> kingcoda.com/how-to-create-wildcard-dns-for-custom-subdomains - Karma


Antworten:


[EDIT] Da ich die Lösung getestet habe. Es funktioniert jetzt wie ein Traum, wie unten beschrieben. Ich hatte einen albernen Ausrutscher in meiner Regex gemacht, der jetzt korrigiert ist.

Die Idee ist, RewriteCond zu verwenden, um den FQDN in der Anfrage zu erfassen und aufzuteilen. Der Regex erfasst den äußersten linken Teil des Domain-Namens, der dann in der RewriteRule mit% 1 zurückreferenziert wird. Ich entkomme auch dem 'Öffentlichkeit' Verzeichnis aus der Übersetzung, wodurch es über einen URI-Pfad zugänglich gemacht wird, der allen fqdn: s zugeordnet ist, die der Site zugeordnet sind (siehe Testergebnis für konkretes Beispiel).

  • Ich habe die virtuelle Hosts-Datei für den Zweck dieses Experiments deaktiviert.
  • Meine DNS-Punkte client1.multisite.dev und client2.multisite.dev zu meinem Apache 2.2 Testserver.
  • Das folgende Snippet befindet sich in meiner 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

Ich habe diese Verzeichnisstruktur erstellt.

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

Jedes Verzeichnis hat eine separate Datei namens index.htm. Der Inhalt von index.htm gibt den Verzeichnispfad an, in dem es platziert wird.

Surfen zu http://client1.multisite.dev/public/index.htm Oder zu http://client2.multisite.dev/public/index.htm gibt dieses Ergebnis:

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

Surfen zu http://client1.multisite.dev/uploads/index.htm gibt dieses Ergebnis:

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

Surfen zu http://client2.multisite.dev/uploads/index.htm gibt dieses Ergebnis:

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

Ich habe auch Mischfälle getestet, als ich die URL in meinen Webbrowser eingegeben habe. Alles wird in Kleinbuchstaben übersetzt.

Ich stelle fest, dass Sie Apache unter Windows ausführen, deren native Dateisysteme die Groß- und Kleinschreibung nicht beachten. Normalisieren Fall wäre daher keine Voraussetzung, obwohl ich persönlich finden Kleinbuchstaben URL: s ästhetisch ansprechend in meinem Browser zu sehen. Bei Dateisystemen, bei denen die Groß- / Kleinschreibung beachtet werden muss, ist eine Normalisierung jedoch erforderlich, daher schließe ich sie zur Vervollständigung ein.

Schließlich habe ich auch bemerkt, dass das Ausführen von Apache an einem anderen Port als 80 (d. H. Es in der URL buchstabieren muss) die Rückwärtsreferenz von RewriteRule unterbricht. Ich habe jedoch keine Lösung dafür gesucht.

Ich hoffe, das ist gleich oder nah genug an dem, was Sie brauchen.


6
2017-12-10 21:23



Vielen Dank. Ich weiß nicht, warum ich diesen Ansatz überhaupt nicht angewendet habe. Aus irgendeinem Grund war ich bei der Verwendung von Alias ​​festgefahren. Ich habe das nicht versucht, aber es ist definitiv die einfache Lösung. - nnichols
Es tut mir leid, dass ich aufgrund tonnenweise Arbeit keine Zeit habe, dies zu testen (zum Beispiel bemerke ich, dass ich es vermisste, die Punkte im Rewritecond Regex zu umgehen), aber bis ich kann, gibt es viele Ressourcen mit Beispielen und Variationen zu google. Zum Beispiel: httpd.apache.org/docs/2.4/rewrite/vhosts.html und vicvijayakumar.com/2013/01/16/mass-virtual-hosting-in-apache und so weiter. - ErikE
@nnichols Hast du das schon probiert? Wie ist es gelaufen? - Michael Hampton♦


Versuchen Sie 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>

3
2017-11-25 10:56



Danke, dass Sie sich die Zeit genommen haben, Ihren Vorschlag zu machen, aber das würde mein Problem nicht lösen. Es erlaubt VirtualScriptAlias, aber nicht VirtualAlias. - nnichols