So konvertieren Sie eine Subdomäne in einen Pfad mit Embedded Tomcat 8 und Spring Boot

8

Wie man Subdomains in Pfade umschreibt?

Beispiel:

  • foo.bar .beispiel.de - & gt; Beispiel.com / foo / bar

Oder besser wäre (Ordner umzukehren):

  • foo.bar .beispiel.de - & gt; example.com / bar / foo

Die Anforderung foo.bar .example.com sollte eine Datei in / src / main / resources / static / bar / foo /index.html.

Bei Apache2 geschieht dies durch mod_rewrite . Ich habe eine Dokumentation über das Neuschreiben mit Tomcat 8 gefunden, aber die Frage ist, wo diese Dateien mit Spring-Boot abgelegt werden ?

Aktualisieren

Ich habe versucht, den UrlRewriteFilter zu verwenden, aber es scheint nicht möglich zu sein, Regeln im Domain-Pfad zu definieren, die die Substitution von regulären Ausdrücken verwenden.

Dies ist meine Konfiguration:

Abhängigkeit von Maven:

%Vor%

Spring Java Config zur Registrierung des Servlet-Filters:

%Vor%

urlrewrite.xml in / src / main / webapp / WEB-INF

%Vor%

Mit dieser hardcoded Domain funktioniert es, aber es sollte für jede Subdomain funktionieren.

    
d0x 05.12.2014, 14:47
quelle

4 Antworten

7

Erstellen Sie Ihren eigenen Filter.

Dieser Filter sollte:

  • Überprüfen Sie, ob Sie Ihre Anfrage neu schreiben müssen
  • Falls ja, überschreiben Sie URL und URI
  • Anfrage weiterleiten
  • es kommt wieder durch den gleichen Filter, aber die erste Überprüfung liefert false
  • Vergessen Sie nicht und seien Sie vorsichtig, wenn Sie chain.doFilter
  • aufrufen

Durch die Weiterleitung werden keine URLs im Browser geändert. Senden Sie einfach den Inhalt der Datei.

Folgecode könnte die Implementierung eines solchen Filters sein. Dies ist keine Art von sauberem Code. Nur schnell und schmutzig Arbeitscode:

%Vor%

Hier ist die Domain-Klasse:

%Vor%

Und Sie brauchen einen Controller, der alles fängt

%Vor%

Ich bin nicht sicher, ob dies notwendig ist, um andere Methoden in HttpServletRequestWrapper zu überschreiben. Das ist Grund für einen Kommentar.

Sie müssen auch Fälle für die Dateiübertragung behandeln (nicht existent, ...).

    
Walery Strauch 09.12.2014, 04:07
quelle
4

Sie können Backreferences verwenden, um gruppierte Teile zu verwenden, die in Ihrem <condition> übereinstimmen. So etwas -

%Vor%

Natürlich müssen Sie die oben genannte Bedingungsregel anpassen, um den Abgleich zu beenden.

Mehr hier - Ссылка

    
avlesh 09.12.2014 09:05
quelle
3

Eine weitere Möglichkeit, dieses Problem zu lösen: Tun Sie es in Controller selbst. Dies ist meiner Meinung nach besser als mit Filter, weil:

    Der Filter
  • fängt jede Anfrage ab. Hier können Sie besser kontrollieren, welche Anfragen mit dem Subdomain-Muster zugestellt werden sollen. Als Beispiel habe ich /subdomain2path gewählt.
  • Sie müssen URI / URLs nicht ändern / umbrechen und sie erneut über die Filterkette weiterleiten.
  • Alle Logik ist in diesem Controller

Die Methoden getSubdomain und reverseDomain sind die gleichen wie zuvor.

Das ist der Impl:

%Vor%

Die Domain-Klasse ist dieselbe wie zuvor:

%Vor%     
Walery Strauch 09.12.2014 04:44
quelle
-1

Es hat für mich funktioniert. Hoffe, es funktioniert auch für andere.

Bitte verwenden Sie die folgende Abhängigkeit

%Vor%

Erstellt urlrewrite.xml im Ressourcenordner

%Vor%

Hinzugefügt in main ApplicationRunner.java

%Vor%

Und ein CustomURLRewriter erstellt

%Vor%     
gursahib.singh.sahni 06.08.2017 14:37
quelle