2016-06-04 3 views
1

Я пытался понять это на некоторое время.перенаправить весь трафик на https: // www. на nginx

Я хотел бы перенаправить весь трафик на https независимо от того, что пользователь помещает в строку url.

Из-сессий он либо нуждается, чтобы быть всегда NO-WWW или Всегда с WWW

Вот мой текущий Nginx конфигурации.

Какое изменение я должен сделать, чтобы перенаправить все до https?

server { 
    listen 80; 
    listen 443; 

    server_name example.com www.example.com; 
    access_log /var/log/nginx/example-access.log; 
    error_log /var/log/nginx/example-error.log; 
    root /var/www/html/web; 

    index index.html index.htm index.php; 

    location/{ 
    try_files $uri $uri/ /index.php$uri?$args; 
    } 

    rewrite ^/backend\.php/?(.*)$ /$1 permanent; 
    location /admin { 
    index admin content backend.php; 
    try_files $uri @rewriteapp; 
    } 

location @rewriteapp { 
    rewrite ^(.*)$ /backend.php/$1 last; 
    } 

location ~ "^(.+\.php)($|/)" { 
    fastcgi_split_path_info ^(.+\.php)(.*)$; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param SCRIPT_NAME $fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_pass 127.0.0.1:9000; 
    include  fastcgi_params; 
    } 
} 
+0

У Serverfault есть [наиболее полный ответ] (http://serverfault.com/questions/67316/in-nginx-how-can-i-rewrite-all-http-requests-to-https-while-maintaining- sub-dom), идея состоит в том, чтобы сопоставить 'server_name' как с WWW, так и с NON-WWW, а затем возвращать 301 https //: ...' для всего сервера. По сути вам нужны два блока сервера. – grochmal

+0

Страница не перенаправляется должным образом Firefox установил, что сервер перенаправляет запрос на этот адрес таким образом, который никогда не будет завершен. Эта проблема иногда может быть вызвана отключением или отказом принимать файлы cookie. - очистить файлы cookie без разницы – smugford

+0

Я добавил ответ, потому что он слишком большой для комментария. См. Примечание в ответе, '301' довольно опасно для тестирования, потому что браузер помнит об этом и не выдаст другой GET (или POST) URL-адресу, для которого он получил' 301'. – grochmal

ответ

0

Вам нужно два блока сервера, что является лучшей практикой с nginx

server { 
    listen 80; 
    server_name example.com www.example.com; 
    return 301 https://$server_name$request_uri; 
} 

server { 
    listen 443 ssl; 
    server_name example.com www.example.com; 

    ssl_certificate  mycert.crt; 
    ssl_certificate_key mycert.key; 
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers   HIGH:!aNULL:!MD5; 

    ... (all the locations, index and etecetras) 
} 

Обратите внимание, что вы должны использовать listen 443 ssl для enable ssl. В противном случае nginx был бы полностью счастлив в обслуживании контента через HTTP на порту 443.

Я не вижу сертификатов SSL или разрешенных протоколов/шифров в вашем вопросе, поэтому я добавил их в ответ на всякий случай.


Обратите внимание, что 301 запоминается браузерами. Как только браузер увидит 301, он будет перенаправлен навсегда (или пока вы не уничтожите его кеш). Для целей отладки лучше использовать 302, а затем изменить его на 301 на производстве.

Смежные вопросы