Ich verwende eine Sinatra-App hinter Passenger / Nginx. Ich versuche, es dazu zu bringen, sowohl auf http- als auch auf https-Anrufe zu antworten. Das Problem ist, wenn beide im Serverblock definiert sind, werden https-Aufrufe normal beantwortet, aber http ergibt den Fehler 400 "Die einfache HTTP-Anforderung wurde an den HTTPS-Port gesendet". Dies ist für eine statische Seite, also hat Sinatra vermutlich nichts damit zu tun. Irgendwelche Ideen, wie man das behebt?
Hier ist der Serverblock:
server {
listen 80;
listen 443 ssl;
server_name localhost;
root /home/myhome/app/public;
passenger_enabled on;
ssl on;
ssl_certificate /opt/nginx/ssl_keys/ssl.crt;
ssl_certificate_key /opt/nginx/ssl_keys/ssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location /static {
root /home/myhome/app/public;
index index.html index.htm index.php;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 /500.html;
access_log /home/myhome/app/logs/access.log;
error_log /home/myhome/app/logs/error.log;
}
my.example.com:443
nicht funktioniert hat. Ändern Sie das stattdessen, um zuhttps://my.example.com
funktionieren. Seltsam, hatte nie dieses Problem mit Apache.ssl on;
Weist NGINX an, JEDEN Inhalt über SSL zu bedienen . Verwenden Sie das "ssl" -Flag am Ende Ihreslisten 443;
zB,listen 443 ssl;
wenn Ihr Server sowohl http- als auch https-Verkehr liefert, und entfernen Sie diessl on;
Direktive.Antworten:
Ich bin auf ein ähnliches Problem gestoßen. Es funktioniert auf einem Server und nicht auf einem anderen Server mit derselben Nginx-Konfiguration. Die Lösung, die von Igor beantwortet wird, finden Sie hier http://forum.nginx.org/read.php?2,1612,1627#msg-1627
Ja. Oder Sie können SSL- / Nicht-SSL-Server auf einem Server kombinieren:
quelle
ssl off;
ssl on;
(keine Notwendigkeit, ssl off hinzuzufügen). Auch, weil ich mich nicht erinnern , die Nginx - Version, gibt es keine Notwendigkeit mehr, den Einsatzdefault
auflisten 443
Linie. Die OP-Konfiguration war also in Ordnung, musste nur entfernt werdenssl on
und sollte funktionieren.ssl on
. @ MichaelJ.Evans Antwort unten ist eine viel bessere Lösung.Die obigen Antworten sind insofern falsch, als die meisten "Ist diese Verbindung HTTPS" -Test überschreiben, um das Bereitstellen der Seiten über http unabhängig von der Verbindungssicherheit zu ermöglichen.
Die sichere Antwort unter Verwendung einer Fehlerseite in einem NGINX-spezifischen http 4xx-Fehlercode, um den Client umzuleiten und dieselbe Anforderung an https zu wiederholen. (wie hier beschrieben /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )
Das OP sollte verwenden:
quelle
nginx['custom_gitlab_server_config'] = "error_page 497 https://$host:$server_port$request_uri;"
den TrickDer Fehler sagt eigentlich alles. Ihre Konfiguration weist Nginx an, Port 80 (HTTP) abzuhören und SSL zu verwenden. Wenn Sie auf Ihren Browser zeigen
http://localhost
, versucht er, eine Verbindung über HTTP herzustellen. Da Nginx SSL erwartet, beschwert es sich über den Fehler.Die Problemumgehung ist sehr einfach. Sie benötigen zwei
server
Abschnitte:quelle
Ich hatte genau das gleiche Problem, ich habe die gleiche Konfiguration wie Ihr Beispiel und ich habe es durch Entfernen der Zeile zum Laufen gebracht:
ssl on;
So zitieren Sie das Dokument:
quelle
Laut Wikipedia-Artikel über Statuscodes . Nginx hat einen benutzerdefinierten Fehlercode, wenn http-Verkehr an den https-Port gesendet wird (Fehlercode 497).
Und gemäß den Nginx-Dokumenten auf error_page können Sie einen URI definieren, der für einen bestimmten Fehler angezeigt wird.
Auf diese Weise können wir eine URL erstellen, an die Clients gesendet werden, wenn der Fehlercode 497 ausgelöst wird.
nginx.conf
Wenn ein Client jedoch eine Anfrage über eine andere Methode als ein GET stellt, wird diese Anfrage in ein GET umgewandelt. Um die Anforderungsmethode beizubehalten, über die der Client eingegangen ist; Wir verwenden Fehlerverarbeitungsumleitungen, wie in den Nginx-Dokumenten auf error_page gezeigt
Und deshalb verwenden wir die
301 =307
Weiterleitung.Mit der hier gezeigten Datei nginx.conf können http und https denselben Port abhören
quelle
Hier ist ein Beispiel für die Konfiguration von HTTP und HTTPS in demselben Konfigurationsblock mit IPv6- Unterstützung. Die Konfiguration wird in Ubuntu Server und NGINX / 1.4.6 getestet , dies sollte jedoch mit allen Servern funktionieren.
Geben Sie nicht an,
ssl on
was zu400
Fehlern führen kann. Die obige Konfiguration sollte funktionierenHoffe das hilft!
quelle
Wenn Sie phpmyadmin verwenden, fügen Sie Folgendes hinzu: fastcgi_param HTTPS on;
quelle
Eigentlich kann man das machen mit:
Dies löste mein Problem bei der Verwendung von nginxvhosts; Jetzt kann ich sowohl SSL als auch einfaches HTTP verwenden. Funktioniert auch mit kombinierten Ports.
quelle