В моей конфигурации nginx я намеревался достичь следующих целей:
- переслать www на не-www
- переслать https на http
- используйте только https для uri с шаблоном 'secure'
Код ниже достигает целей, за исключением пункт 3, Chrome показывает пустую страницу с ошибкой "Эта веб-страница имеет цикл перенаправления". Кто-нибудь может указать правильную конфигурацию для этого и / или какой-либо лучший код?
#redirect www to non-www
server {
listen 80;
server_name www.example.org;
return 301 http://example.org$request_uri;
}
#redirect https to http, for both www and non-www
#but process https for uri with pattern 'secure'
server {
ssl_certificate /home/mydomain/ssl.cert;
ssl_certificate_key /home/mydomain/ssl.key;
listen 443 ssl;
server_name www.example.org example.org;
root /home/mydomain/public_html/mydomain/public;
index index.php;
access_log /var/log/virtualmin/example.org_access_log;
error_log /var/log/virtualmin/example.org_error_log;
#if has pattern 'secure', just process
#---problem is here, chrome result 'This webpage has a redirect loop'---
location ~ ^/(secure) {
try_files $uri $uri/ /index.php$is_args$args;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
return 301 http://example.org$request_uri;
}
server {
listen 80;
server_name example.org;
root /home/mydomain/public_html/mydomain/public;
index index.php;
access_log /var/log/virtualmin/example.org_access_log;
error_log /var/log/virtualmin/example.org_error_log;
#rewrite to https if has pattern secure
location ~ ^/(secure) {
#rewrite ^(.*) https://$host$1 permanent;
return 301 https://example.org$request_uri;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Закончился перенаправлением ssl на уровне приложения
Route::filter('check.ssl', function()
{
$segment = Request::segment(1);
if ( ( $segment == 'secure') && ( !Request::secure() ) )
return Redirect::secure(Request::getRequestUri());
else if ( ( $segment != 'secure') && ( Request::secure() ) )
return Redirect::to(Request::path(), 302, array(), false);
});
Замените это:
location ~ ^/(secure) {
try_files $uri $uri/ /index.php$is_args$args;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
return 301 http://example.org$request_uri;
С этим:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
if ( $uri !~ ^/(secure) ){
return 301 http://riwa.nu$request_uri;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
И должно работать нормально :-)