Leiten Sie HTTP zu HTTPS auf dem virtuellen Standardhost ohne Servernamen um

73

Auf meinem Apache-Server möchte ich alle eingehenden http-Anforderungen an die entsprechende https-Anforderung umleiten können. Der Haken ist, dass ich dies für meinen virtuellen Standardhost tun möchte, ohne das anzugeben, ServerNameund dass die Umleitung mit dem in der Anforderungs-URL angegebenen Servernamen funktioniert. Ich hoffe auf so etwas:

NameVirtualHost *:80
<VirtualHost *:80>
    RedirectPermanent / https://%{SERVER_NAME}/
    ...
</VirtualHost>

Ist dies mit möglich Redirectoder muss ich darauf zurückgreifen Rewrite?

stark koffeinhaltig
quelle

Antworten:

107

Versuchen Sie dies in Ihrer vhost-Konfiguration hinzuzufügen:

RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
Jon Lin
quelle
* Möglicherweise müssen Sie mod_rewrite hinzufügen. Für Ubuntu- oder Debian-basierte Hosts würde Folgendes funktionieren: sudo a2enmod rewriteDies würde alle Konfigurationsfehler von configtest / apache2 stoppen. (Was ein Aktien-Setup erhalten würde, vorausgesetzt, Sie verwenden die oben angegebenen vhost-Ergänzungen)
Joseph Orlando
Dies funktioniert nur für die Hauptdomäne (zB http://mywebiste.com-> https://mywebiste.com). Was ist, wenn ich auch Subdomaind ( http://blog.mywebiste.com-> https://blog.mywebiste.com) habe?
EsseTi
13
Möglicherweise müssen Sie RewriteCond% {HTTPS} off nach RewriteEngine On hinzufügen, andernfalls erhalten Sie möglicherweise eine ERR_TOO_MANY_REDIRECTS
Max
Kleiner Tippfehler. Ein Schrägstrich fehlt, die Umschreibungsregel sollte lautenhttps://%{HTTP_HOST}/$1 [R=301,L]
Dunatotatos
1
@Dunatotatos im vhost enthält der URI einen führenden /, aber in einer htaccess-Datei wird das /Präfix entfernt. Wenn die Regel in einer htaccess-Datei wäre, würden wir in der Tat eine /vor dem$1
Jon Lin
83

Beides funktioniert gut. Gemäß den Apache-Dokumenten sollten Sie jedoch die Verwendung mod_rewritefür einfache Umleitungen vermeiden und Redirectstattdessen verwenden. Ihnen zufolge sollten Sie also vorzugsweise Folgendes tun:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Das erste /nach Redirectist die URL, der zweite Teil ist, wo es umgeleitet werden sollte.

Sie können es auch verwenden, um URLs in eine Subdomain umzuleiten: Redirect /one/ http://one.example.com/

orszaczky
quelle
40
Dies wird nicht beantwortet, ohne den Servernamen- Teil der Frage anzugeben
Zam Sunk
Dies funktioniert für mein Setup. Vergessen Sie auch nicht den
abschließenden
Danke, sehr hilfreich und viel weniger komplex.
Kiwicomb123
Wenn Sie example.com auf example.com umleiten möchten, vergessen Sie nicht, die SSL-Konfiguration in VirtualHost zu speichern: <VirtualHost *: 443> Servername example.com SSLEngine in SSLCertificateFile ... SSLCertificateKeyFile ... Permanent / example umleiten . com </ VirtualHost> oder es wird standardmäßig 443 virtualhost mit nicht korrektem SSL-Zertifikat umgeleitet. Vergessen Sie auch nicht den abschließenden Schrägstrich, sonst wird er nicht ordnungsgemäß mit Unterordnern umgeleitet (wie von vdidxho angegeben).
David Najman
37

Dies ist der vollständige Weg, um auch nicht benötigte Weiterleitungen wegzulassen;)

Diese Regeln sollen in .htaccess-Dateien verwendet werden, da eine RewriteRule in einem VirtualHost-Eintrag *: 80 keine Bedingungen erfordert.

RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]

Erklärungen :

RewriteEngine on

==> überhaupt den Motor aktivieren

RewriteCond %{HTTPS} off [OR]

==> Übereinstimmung bei Nicht-https- Verbindungen oder (das Nicht-Setzen von [ODER] würde ein implizites UND verursachen!)

RewriteCond %{HTTP:X-Forwarded-Proto} !https

==> Übereinstimmung bei weitergeleiteten Verbindungen (Proxy, Loadbalancer usw.) ohne https

RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]

==> Wenn eine der beiden Bedingungen übereinstimmt, schreiben Sie die gesamte URL neu und senden Sie eine 301, damit der Client dies lernt (manche tun es, andere nicht) und das L für die letzte Regel.

Jimmy Koerting
quelle
Ein weiteres Problem, mit dem Sie RewriteRulewahrscheinlich nie übereinstimmen werden. Ich bin mir ziemlich sicher, dass Sie den Schrägstrich fallen lassen möchten:RewriteRule ^(.*) …
Mark Fox
Ich bin mir ziemlich sicher, dass ich es nicht tun werde. Sie haben die / -Syntax des Ziels einschließlich des 'L'-Flags verpasst. Der andere Weg ist es wie Jon Lin.
Jimmy Koerting
10
Die RewriteCond ist in diesem Fall völlig überflüssig; Da der VirtualHost bereits als definiert ist <VirtualHost *:80>, %{SERVER_PORT}wird er niemals 443 sein, sodass die Bedingung immer übereinstimmt.
Doktor J
1
* Möglicherweise müssen Sie mod_rewrite hinzufügen. Für Ubuntu- oder Debian-basierte Hosts würde Folgendes funktionieren: sudo a2enmod rewriteDies würde alle Konfigurationsfehler von configtest / apache2 stoppen. (Was ein Lager-Setup erhalten würde, vorausgesetzt, Sie verwenden die oben angegebenen vhost-Ergänzungen)
Joseph Orlando
0

Ich habe mkcert verwendet , um unendliche * .dev.net-Subdomains & localhost mit gültigen HTTPS / SSL-Zertifikaten zu erstellen (Windows 10 XAMPP & Linux Debian 10 Apache2).

Ich erstelle die Zertifikate unter Windows mit mkcert v1.4.0 (führe CMD als Administrator aus):

mkcert -install
mkcert localhost "*.dev.net"

Dies erstellt in Windows 10 diese Dateien (ich werde es zuerst in Windows 10 XAMPP installieren)

localhost+1.pem
localhost+1-key.pem

Überschreiben Sie die XAMPP-Standardzertifikate:

copy "localhost+1.pem" C:\xampp\apache\conf\ssl.crt\server.crt
copy "localhost+1-key.pem"  C:\xampp\apache\conf\ssl.key\server.key

Aktivieren Sie jetzt in Apache2 für Debian 10 SSL & vhost_alias

a2enmod vhosts_alias
a2enmod ssl
a2ensite default-ssl
systemctl restart apache2

Fügen Sie für vhost_alias diese Apache2-Konfiguration hinzu:

nano /etc/apache2/sites-available/999-vhosts_alias.conf

Mit diesem Inhalt:

<VirtualHost *:80>
   UseCanonicalName Off
   ServerAlias *.dev.net
   VirtualDocumentRoot "/var/www/html/%0/"
</VirtualHost>

Fügen Sie die Site hinzu:

a2ensite 999-vhosts_alias

Kopieren Sie die Zertifikate per SSH nach / root / mkcert und lassen Sie die Debian-Zertifikate überschreiben:

systemctl stop apache2

mv /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/certs/ssl-cert-snakeoil.pem.bak
mv /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/private/ssl-cert-snakeoil.key.bak

cp "localhost+1.pem" /etc/ssl/certs/ssl-cert-snakeoil.pem
cp "localhost+1-key.pem" /etc/ssl/private/ssl-cert-snakeoil.key

chown root:ssl-cert /etc/ssl/private/ssl-cert-snakeoil.key
chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key

systemctl start apache2

Bearbeiten Sie die SSL-Konfiguration

nano /etc/apache2/sites-enabled/default-ssl.conf

Bearbeiten Sie zu Beginn die Datei mit folgendem Inhalt:

<IfModule mod_ssl.c>
    <VirtualHost *:443>

            UseCanonicalName Off
            ServerAlias *.dev.net
            ServerAdmin webmaster@localhost

            # DocumentRoot /var/www/html/
            VirtualDocumentRoot /var/www/html/%0/

...

Letzter Neustart:

systemctl restart apache2

HINWEIS: Vergessen Sie nicht, die Ordner für Ihre Subdomains in / var / www / html / zu erstellen

/var/www/html/subdomain1.dev.net
/var/www/html/subdomain2.dev.net
/var/www/html/subdomain3.dev.net
davidjimenez75
quelle