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?

Antworten:


107

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

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

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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.