Umleiten von http zu https

Moin,

ich habe einen Webserver, der auf Port 443 (SSL) läuft.
Laut Konfiguration und netstat horcht er aber auch auf Port 80.

Eine Verbindung an diesen Port klappt aber nicht, er läuft irgendwann auf einen Timeout. Im acces_log oder error_log steht dieser Verbindungsversuch nicht drin.

Nun hab ich schon ein wenig gegooglet, aber die Empfehlungen funktionieren bei mir nicht.
Die Möglichkeit mit „Redirect permanent“ führt natürlich in einen Loop und die anderen zwei Möglichkeiten per RewriteEngine machen auch scheinbar nichts. mod_rewrite wird jedenfalls geladen und an anderer Stelle auch benutzt.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

oder

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://myurl.com/$1 [R,L]

haben beide keinen Effekt.

So langsam bin ich mit meinem Latein am Ende.

Kann mir jemand weiter helfen?

Vielen Dank,
-Efchen

Hallo,

ich habe einen Webserver, der auf Port 443 (SSL) läuft.

es gibt verschiedene Webserver, die in unterschiedlichen Konfigurationen betrieben werden können.

Die Möglichkeit mit „Redirect permanent“ führt natürlich in
einen Loop und die anderen zwei Möglichkeiten per
RewriteEngine machen auch scheinbar nichts.

Bestimmte Artikel sollten sich auf tatsächlich bestimmte Dinge beziehen – von welchen „drei“ Möglichkeiten sprichst du?

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Wo hast du das reingeschrieben?


PHvL

es gibt verschiedene Webserver, die in unterschiedlichen
Konfigurationen betrieben werden können.

Apache/2.2.4 Linux/SUSE
Was von der Konfiguration musst Du wissen?

Bestimmte Artikel sollten sich auf tatsächlich bestimmte Dinge
beziehen – von welchen „drei“ Möglichkeiten sprichst du?

Die habe ich nachfolgend beschrieben.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Wo hast du das reingeschrieben?

Ins default-server.conf

Hallo,

ich habe einen Webserver, der auf Port 443 (SSL) läuft.
Laut Konfiguration und netstat horcht er aber auch auf Port
80.

Wie sieht denn dieser Teil der Konfiguration aus?

Bei Debians Apache2 sieht das (in /etc/apach2/ports.conf) per Default so aus:

NameVirtualHost *:80
Listen 80

SSL name based virtual hosts are not yet supported, therefore no

NameVirtualHost statement here

Listen 443

Wenn das bei dir aehnlich aussieht, musst du natuerlich auch noch einen virtual host fuer *:80 einrichten, der den redirect macht.

Nun hab ich schon ein wenig gegooglet, aber die Empfehlungen
funktionieren bei mir nicht.
Die Möglichkeit mit „Redirect permanent“ führt natürlich in
einen Loop

Nur wenn der redirect vom Handler fuer den Port 443 gemacht wird.

und die anderen zwei Möglichkeiten per
RewriteEngine machen auch scheinbar nichts.

Solange im access.log nichts auftaucht, wird auch die Rewrite-Engine nicht anspringen.

Zum Debuggen waere es vielleicht einfacher, wenn du per http eine andere Seite auslieferst als per https. Wenn das funktioniert, kannst du die http-Seite durch einen redirect ersetzen.

Gruesse,
Moritz

Wie sieht denn dieser Teil der Konfiguration aus?

NameVirtualHost kommt bei mir nicht vor, ich verwende auch keine Virtual Hosts, weil da nur ein einziger drauf läuft.

Listen 80

Listen 443

im listen.conf

Wenn das bei dir aehnlich aussieht, musst du natuerlich auch
noch einen virtual host fuer *:80 einrichten, der den redirect
macht.

Das heißt, ich brauche ZWINGEND zwei virtual Hosts? Einer, der auf Port 80 listened und einer der auf Port 443 listened?

Danke,
-Efchen

Ich hab jetzt mal Virtual Hosts eingerichtet.

NameVirtualHost *:80
NameVirtualHost *:443

 ServerName xxx
 Redirect permanent / https://xxx/

 DocumentRoot "xxx"
 ServerAdmin xxx
 ServerName xxx (der selbe wie oben!)
 SSLEngine on
 SSLCertificateFile xxx.crt
 SSLCertificateKeyFile xxx.key

Aber das Verhalten ist das selbe wie vorher, auf Port 80 läuft er irgendwann auf einen Timeout.

Was mache ich falsch?

Hei!

leg doch auf dem Host für den Port 80 einfach eine leere Dummy-Seite mit einer Weiterleitung an.

und gut ist.

lg, mabuse

Hallo,

leg doch auf dem Host für den Port 80 einfach eine leere
Dummy-Seite mit einer Weiterleitung an.

Sehr hilfreich, wenn die Verbindung zu Port 80 ein Timeout erzeugt.

Gruesse,
Moritz

Hallo,

Ich hab jetzt mal Virtual Hosts eingerichtet.
NameVirtualHost *:80
NameVirtualHost *:443

… und die zugehörigen Listen-Anweisungen stehen auch noch irgendwo, oder?

Aber das Verhalten ist das selbe wie vorher, auf Port 80 läuft
er irgendwann auf einen Timeout.

Wird der VirtualHost auf Port 80 von

apache2ctl -S

aufgelistet?

Hast du schoneinmal versucht vom Server selbst aus auf den Apache zuzugreifen? Also etwa

wget http://localhost/


PHvL

1 Like

Guten Morgen!

Das war eine hilfreiche Antwort, wenngleich sie mein Problem noch nicht gelöst hat.

apache2ctl -S listet beide Virtual Hosts, „*:443“ und „*:80“, beide mit den selben Angaben (soll ja beides der selbe ServerName sein).

\*:443 is a NameVirtualHost
default server xxx (/etc/apache2/vhosts.d/vhosts.conf:6)
port 443 namevhost xxx (...)

Ja, die Listen-Anweisungen stehen auch noch in der Konfiguration, unverändert, wie weiter oben gepostet.

Das wget fand ich interessant!
wget connected tatsächlich an Port 80, trifft auf die Redirect-Direktive (301 Moved Permanently) und stellt eine Verbindung zu Port 443 her und lädt die Datei runter.
Und das funktioniert tatsächlich nur auf dem lokalen Rechner mit „localhost“. Auch aus einem Browser heraus.

Aber ein NamedVirtualHost geht doch über den Servernamen und nicht über die IP#. Von daher müsste es doch auch von außen gehen. Stellt es also vielleicht doch ein Problem dar, dass beide VirtualHosts den selben ServerName haben? Oder ist das egal, wenn das zwei unterschiedliche Ports sind, wie hier?

Wieso ist es also ein Unterschied, ob der Server per „localhost“ oder über seinen richtigen Namen angesprochen wird?

Du hast mir einen wichtigen Tipp gegeben, ob Du vielleicht auch den entscheidenden weißt?

Vielen Dank schonmal!
-Efchen

Hallo,

wget connected tatsächlich an Port 80, trifft auf die
Redirect-Direktive (301 Moved Permanently) und stellt eine
Verbindung zu Port 443 her und lädt die Datei runter.

das heißt, die Apache-Konfiguration ist grundsätzlich korrekt.

Aber ein NamedVirtualHost geht doch über den Servernamen und
nicht über die IP#.

Die Verbindung wird stets über die IP aufgebaut. Erst wenn die Verbindung aufgebaut ist, sendet der Client den Hostnamen und der Apache antwortet dann entsprechend.

Sendet der Client keinen Hostnamen oder einen für den kein expliziter VirtualHost angelegt ist (in unserem Fall localhost), so benutzt Apache den Standardserver, was regelmäßig einfach der erste VirtualHost ist.

Von daher müsste es doch auch von außen gehen.

Von außen wird die Verbindung offensichtlich garnicht erst aufgebaut (Timeout). Kann es sein, dass da eine Firewall im Spiel ist, die die Anfrage verschluckt?

Stellt es also vielleicht doch ein Problem dar, dass
beide VirtualHosts den selben ServerName haben?

Nein.


PHvL

Hei!

Sehr hilfreich, wenn die Verbindung zu Port 80 ein Timeout erzeugt.

Du bekommst das Timeout höchstwahrscheinlich, weil der Server auf Anfragen nicht antwortet.
Wie soll er auch, wenn es keine Seite zum Ausliefern gibt.
Leg doch erst mal irgendeine Testseite und die 404-Seite an - dann weisst du mehr.

lg, mabuse

Eine Seite zum Ausliefern gibt es immer. Und wenn es 404 ist.

Ja,

der Gedanke kam mir auch gerade, dass das die Firewall ist.

Ich hab mir die Konfiguration angesehen, es war tatsächlich nur HTTPS freigeschaltet. Jetzt hab ich HTTP zusätzlich eingetragen aber trotzdem gehts nicht. Im Firewall-Logfile stehen diese Verbindungsversuche auch nicht drin.

Ich hab für alle Zonen HTTP (80) zusätzlich als erlaubt eingetragen und Firewall neu gestartet.

Yast2/OpenSUSE

Was mach ich nun falsch? :frowning:

Danke,
-Efchen