Назад | Перейти на главную страницу

Nginx с www на не-www, пересылать на http и пересылать на https в определенном месте

В моей конфигурации nginx я намеревался достичь следующих целей:

  1. переслать www на не-www
  2. переслать https на http
  3. используйте только 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;
   }

И должно работать нормально :-)