Я настроил свой сервер со следующими настройками:
server {
server_name www.example.com
listen 443;
listen 80;
location /login\.php
{
rewrite ^(.*) https://www.example.com/login.php$1 last;
}
.. other settings
}
Однако при такой настройке я получаю ошибку перенаправления (слишком много перенаправлений). Есть ли способ сообщить nginx, что если у меня есть файл login.php, то мне нужен SSL, а все остальные файлы обслуживаются без него?
решение1
Начиная с версии nginx 0.7.14, вы можете создать компактную конфигурацию для обслуживания http и https без разделения на отдельные серверные {} блоки:
listen 80;
listen 443 ssl;
# rest ssl configuration...
Если вы хотите защитить несколько местоположений - просто проверьте схему и сделайте перенаправление с помощью «return» или «rewrite»:
location = /login.php {
if($scheme = "http") {
rewrite ^ https://$host$request_uri? permanent;
}
...
}
решение2
Можно (см. другой ответ), но, как правило, лучше все зашифровать — безопасная передача имени пользователя и пароля, а затем предоставление им cookie-файла для полного доступа к учетной записи в открытом виде почти так же опасно, как и полное отсутствие шифрования.
В качестве примера того, насколько это опасно, посмотрите здесь программу, которая автоматически присваивает себе пользователей Twitter / Facebook / Google и т. д., используя эту ошибку -->http://codebutler.com/firesheep
решение3
Поместите listen 80;
и listen 443;
в отдельные server
блоки.
TheSSL-конфигурация(который, как я предполагаю, находится в ваших «.. других настройках») должен попадать только в server
блок, который прослушивает порт 443.