Używam aplikacji Sinatra za pasażerem / nginx. Próbuję sprawić, by odpowiadał zarówno na połączenia http, jak i https. Problem polega na tym, że gdy oba są zdefiniowane w bloku serwera, na wywołania https odpowiadają normalnie, ale http daje błąd 400 „Zwykłe żądanie HTTP zostało wysłane do portu HTTPS”. To jest dla statycznej strony, więc zgaduję, że Sinatra nie ma z tym nic wspólnego. Jakieś pomysły, jak to naprawić?
Oto blok serwera:
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
nie działał. Zmiana tego zamiasthttps://my.example.com
działać. Dziwne, nigdy nie miałem tego problemu z apache.ssl on;
mówi do serwera nginx JAKICHKOLWIEK treści poprzez SSL. Użyj flagi "ssl" na końcu twojego,listen 443;
np.listen 443 ssl;
Jeśli twój serwer dostarcza zarówno ruch http, jak i https, i usuńssl on;
dyrektywę.Odpowiedzi:
Napotkałem podobny problem. Działa na jednym serwerze i nie działa na innym serwerze z taką samą konfiguracją Nginx. Znalazłem rozwiązanie, na które Igor odpowiada tutaj http://forum.nginx.org/read.php?2,1612,1627#msg-1627
Tak. Lub możesz połączyć serwery SSL / bez SSL w jednym serwerze:
źródło
ssl off;
ssl on;
(nie ma potrzeby dodawania ssl off). Ponadto, ponieważ nie pamiętam wersji Nginx, nie ma już potrzeby korzystaniadefault
z Internetulisten 443
. Więc konfiguracja OP była w porządku, wystarczy ją usunąćssl on
i powinna działać.ssl on
. @ MichaelJ.Evans poniżej jest znacznie lepszym rozwiązaniem.Powyższe odpowiedzi są niepoprawne, ponieważ większość z nich zastępuje test „jest to połączenie HTTPS”, aby umożliwić obsługę stron za pośrednictwem protokołu http niezależnie od bezpieczeństwa połączenia.
Bezpieczna odpowiedź przy użyciu strony błędu w kodzie błędu http 4xx specyficznym dla NGINX, aby przekierować klienta do ponownej próby wysłania tego samego żądania do https. (jak opisano tutaj /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )
OP powinien używać:
źródło
nginx['custom_gitlab_server_config'] = "error_page 497 https://$host:$server_port$request_uri;"
wystarczyłyBłąd mówi wszystko. Twoja konfiguracja nakazuje Nginx nasłuchiwać na porcie 80 (HTTP) i używać SSL. Kiedy wskażesz przeglądarkę
http://localhost
, spróbuje połączyć się przez HTTP. Ponieważ Nginx oczekuje SSL, zgłasza błąd.Obejście jest bardzo proste. Potrzebujesz dwóch
server
sekcji:źródło
Miałem dokładnie ten sam problem, mam taką samą konfigurację jak twój przykład i sprawiłem, że działa, usuwając linię:
ssl on;
Cytując dokument:
źródło
Zgodnie z artykułem Wikipedii dotyczącym kodów statusu . Nginx ma niestandardowy kod błędu, gdy ruch HTTP jest wysyłany do portu https (kod błędu 497)
Zgodnie z dokumentacją Nginx na stronie error_page możesz zdefiniować identyfikator URI, który będzie wyświetlany dla określonego błędu.
W ten sposób możemy utworzyć identyfikator URI, do którego klienci będą wysyłani, gdy zostanie zgłoszony kod błędu 497.
nginx.conf
Jeśli jednak klient wysyła żądanie za pomocą innej metody niż GET, żądanie to zostanie przekształcone w GET. W ten sposób, aby zachować metodę żądania, przez którą przyszedł klient; używamy przekierowań przetwarzania błędów, jak pokazano w dokumentach Nginx na stronie error_page
Dlatego używamy
301 =307
przekierowania.Korzystając z pokazanego tutaj pliku nginx.conf, możemy nasłuchiwać http i https na tym samym porcie
źródło
Oto przykład konfiguracji HTTP i HTTPS w tym samym bloku konfiguracyjnym z obsługą IPv6 . Konfiguracja jest testowana w Ubuntu Server i NGINX / 1.4.6, ale powinna działać na wszystkich serwerach.
Nie uwzględniaj,
ssl on
co może powodować400
błąd. Powyższa konfiguracja powinna działać dlaMam nadzieję że to pomoże!
źródło
jeśli używasz phpmyadmin dodaj: fastcgi_param HTTPS on;
źródło
Właściwie możesz to zrobić za pomocą:
To rozwiązało mój problem z używaniem nginxvhosts; teraz mogę używać zarówno SSL, jak i zwykłego HTTP. Działa nawet z połączonymi portami.
źródło