Nginx的www到非www,转发到http,并转发到https在特定的位置

在我的nginxconfiguration中,我打算达到以下目的:

  1. 转发www到非www
  2. 将https转发给http
  3. 只使用模式“安全”的uri上的https

下面的代码达到目标,除了在第3点 ,Chrome显示空白页面,错误“此网页有一个redirect循环”。 任何人都可以告诉适当的configuration,和/或任何更好的代码?

#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; } } 

通过在应用程序级别执行sslredirect结束

 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); }); 

replace这个:

  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; } 

它应该工作得很好:-)