From e64fbbc9ba646207fa14eb716444d3db1fc87406 Mon Sep 17 00:00:00 2001 From: ftimme Date: Tue, 20 Sep 2011 11:10:08 +0000 Subject: [PATCH] - Added redirects for nginx. - Added SEO redirects (both Apache & nginx) to redirect from non-www website to www website or vice versa. - Introduced placeholder [scheme] for redirect paths for alias and subdomains; will be replaced with http or https, depending on what the visitor uses. --- install/sql/incremental/upd_0020.sql | 2 + install/sql/ispconfig3.sql | 1 + .../web/sites/form/web_aliasdomain.tform.php | 2 +- interface/web/sites/form/web_domain.tform.php | 6 ++ .../web/sites/form/web_subdomain.tform.php | 2 +- .../web/sites/lib/lang/de_web_domain.lng | 3 + .../web/sites/lib/lang/en_web_domain.lng | 3 + .../sites/templates/web_domain_redirect.htm | 6 ++ server/conf/nginx_vhost.conf.master | 7 ++ server/conf/vhost.conf.master | 18 ++++- .../plugins-available/apache2_plugin.inc.php | 79 ++++++++++++++----- server/plugins-available/nginx_plugin.inc.php | 23 ++++-- 12 files changed, 124 insertions(+), 28 deletions(-) create mode 100644 install/sql/incremental/upd_0020.sql diff --git a/install/sql/incremental/upd_0020.sql b/install/sql/incremental/upd_0020.sql new file mode 100644 index 0000000000..8d7f5532cf --- /dev/null +++ b/install/sql/incremental/upd_0020.sql @@ -0,0 +1,2 @@ +ALTER TABLE `web_domain` ADD `seo_redirect` VARCHAR( 255 ) default NULL AFTER `redirect_path`; +ALTER TABLE `web_folder_user` ADD `server_id` INT( 11 ) NOT NULL DEFAULT '0' AFTER `sys_perm_other`; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 51bdd81113..bf5e8dbaff 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1493,6 +1493,7 @@ CREATE TABLE `web_domain` ( `ruby` enum('n','y') NOT NULL default 'n', `redirect_type` varchar(255) default NULL, `redirect_path` varchar(255) default NULL, + `seo_redirect` varchar(255) default NULL, `ssl` enum('n','y') NOT NULL default 'n', `ssl_state` varchar(255) NULL, `ssl_locality` varchar(255) NULL, diff --git a/interface/web/sites/form/web_aliasdomain.tform.php b/interface/web/sites/form/web_aliasdomain.tform.php index 72cd2e1e0d..3c191736ab 100644 --- a/interface/web/sites/form/web_aliasdomain.tform.php +++ b/interface/web/sites/form/web_aliasdomain.tform.php @@ -112,7 +112,7 @@ $form["tabs"]['domain'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?\~]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?\~]*(\?\S+)?)?)?)|(\[scheme\]://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?\~]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', 'errmsg'=> 'redirect_error_regex'), ), 'default' => '', diff --git a/interface/web/sites/form/web_domain.tform.php b/interface/web/sites/form/web_domain.tform.php index 5adca053f2..2068391004 100644 --- a/interface/web/sites/form/web_domain.tform.php +++ b/interface/web/sites/form/web_domain.tform.php @@ -245,6 +245,12 @@ $form["tabs"]['redirect'] = array ( 'width' => '30', 'maxlength' => '255' ), + 'seo_redirect' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => array('' => 'no_redirect_txt', 'non_www_to_www' => 'non_www_to_www_txt', 'www_to_non_www' => 'www_to_non_www_txt') + ), ################################## # ENDE Datatable fields ################################## diff --git a/interface/web/sites/form/web_subdomain.tform.php b/interface/web/sites/form/web_subdomain.tform.php index 116c5b449b..ced53bb524 100644 --- a/interface/web/sites/form/web_subdomain.tform.php +++ b/interface/web/sites/form/web_subdomain.tform.php @@ -112,7 +112,7 @@ $form["tabs"]['domain'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?\~]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', + 'regex' => '@^(([.]{0})|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?\~]*(\?\S+)?)?)?)|(\[scheme\]://([-\w\.]+)+(:\d+)?(/([\w/_\.\-\,\+\?\~]*(\?\S+)?)?)?)|(/[\w/_\.\-]{1,255}/))$@', 'errmsg'=> 'redirect_error_regex'), ), 'default' => '', diff --git a/interface/web/sites/lib/lang/de_web_domain.lng b/interface/web/sites/lib/lang/de_web_domain.lng index 5f18f93f87..1226b47611 100644 --- a/interface/web/sites/lib/lang/de_web_domain.lng +++ b/interface/web/sites/lib/lang/de_web_domain.lng @@ -73,4 +73,7 @@ $wb['save_certificate_txt'] = 'Save certificate'; $wb['create_certificate_txt'] = 'Create certificate'; $wb['delete_certificate_txt'] = 'Delete certificate'; $wb['nginx_directives_txt'] = 'nginx Direktiven'; +$wb["seo_redirect_txt"] = 'SEO Redirect'; +$wb["non_www_to_www_txt"] = 'Nicht-www -> www'; +$wb["www_to_non_www_txt"] = 'www -> Nicht-www'; ?> diff --git a/interface/web/sites/lib/lang/en_web_domain.lng b/interface/web/sites/lib/lang/en_web_domain.lng index 8e202b02c6..fb85dcbbe2 100644 --- a/interface/web/sites/lib/lang/en_web_domain.lng +++ b/interface/web/sites/lib/lang/en_web_domain.lng @@ -73,4 +73,7 @@ $wb['save_certificate_txt'] = 'Save certificate'; $wb['create_certificate_txt'] = 'Create certificate'; $wb['delete_certificate_txt'] = 'Delete certificate'; $wb["nginx_directives_txt"] = 'nginx Directives'; +$wb["seo_redirect_txt"] = 'SEO Redirect'; +$wb["non_www_to_www_txt"] = 'Non-www -> www'; +$wb["www_to_non_www_txt"] = 'www -> non-www'; ?> \ No newline at end of file diff --git a/interface/web/sites/templates/web_domain_redirect.htm b/interface/web/sites/templates/web_domain_redirect.htm index 14e1827174..635a44d29b 100644 --- a/interface/web/sites/templates/web_domain_redirect.htm +++ b/interface/web/sites/templates/web_domain_redirect.htm @@ -15,6 +15,12 @@ +
+ + +
diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index ccad2d7560..cc489fcd48 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -11,6 +11,13 @@ server { root ; + + + if ($http_host = "") { + rewrite ^ $scheme://$request_uri permanent; + } + + if ($http_host ~* "$") { diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index d118124f7f..e1d59d4a93 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -191,6 +191,14 @@ RewriteEngine on + + + + RewriteCond %{HTTP_HOST} ^$ [NC] + RewriteRule ^(.*)$ http:///$1 [R=301,L] + + + RewriteCond %{HTTP_HOST} $ [NC] RewriteRule ^/(.*)$ $1 @@ -405,9 +413,17 @@ RewriteEngine on + + + + RewriteCond %{HTTP_HOST} ^$ [NC] + RewriteRule ^(.*)$ https:///$1 [R=301,L] + + + RewriteCond %{HTTP_HOST} ^ [NC] - RewriteRule ^/(.*)$ $1 + RewriteRule ^/(.*)$ $1 diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 5a702b32c2..12f8cc5512 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -671,34 +671,58 @@ class apache2_plugin { if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1; //$vhost_data['document_root'] = $data['new']['document_root'].'/web'; + + // Set SEO Redirect + if($data['new']['seo_redirect'] != '' && ($data['new']['subdomain'] == 'www' || $data['new']['subdomain'] == '*')){ + $vhost_data['seo_redirect_enabled'] = 1; + if($data['new']['seo_redirect'] == 'non_www_to_www'){ + $vhost_data['seo_redirect_origin_domain'] = $data['new']['domain']; + $vhost_data['seo_redirect_target_domain'] = 'www.'.$data['new']['domain']; + } + if($data['new']['seo_redirect'] == 'www_to_non_www'){ + $vhost_data['seo_redirect_origin_domain'] = 'www.'.$data['new']['domain']; + $vhost_data['seo_redirect_target_domain'] = $data['new']['domain']; + } + } else { + $vhost_data['seo_redirect_enabled'] = 0; + } + $tpl->setVar($vhost_data); // Rewrite rules $rewrite_rules = array(); if($data['new']['redirect_type'] != '') { if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/'; + $rewrite_target = $data['new']['redirect_path']; + $rewrite_target_ssl = $data['new']['redirect_path']; /* Disabled path extension if($data['new']['redirect_type'] == 'no' && substr($data['new']['redirect_path'],0,4) != 'http') { $data['new']['redirect_path'] = $data['new']['document_root'].'/web'.realpath($data['new']['redirect_path']).'/'; } */ - $rewrite_rules[] = array( 'rewrite_domain' => $data['new']['domain'], - 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', - 'rewrite_target' => $data['new']['redirect_path']); - switch($data['new']['subdomain']) { case 'www': - $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$data['new']['domain'], + $rewrite_rules[] = array( 'rewrite_domain' => '^'.$data['new']['domain'], + 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); + $rewrite_rules[] = array( 'rewrite_domain' => '^www.'.$data['new']['domain'], 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', - 'rewrite_target' => $data['new']['redirect_path']); + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); break; case '*': - // TODO - //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias['domain'], - // 'rewrite_type' => $alias['redirect_type'], - // 'rewrite_target' => $alias['redirect_path']); + $rewrite_rules[] = array( 'rewrite_domain' => $data['new']['domain'], + 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); break; + default: + $rewrite_rules[] = array( 'rewrite_domain' => '^'.$data['new']['domain'], + 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); } } @@ -729,27 +753,42 @@ class apache2_plugin { $app->log('Add server alias: '.$alias['domain'],LOGLEVEL_DEBUG); // Rewriting if($alias['redirect_type'] != '') { - if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/'; + if(substr($alias['redirect_path'],-1) != '/') $alias['redirect_path'] .= '/'; + if(substr($alias['redirect_path'],0,8) == '[scheme]'){ + $rewrite_target = 'http'.substr($alias['redirect_path'],8); + $rewrite_target_ssl = 'https'.substr($alias['redirect_path'],8); + } else { + $rewrite_target = $alias['redirect_path']; + $rewrite_target_ssl = $alias['redirect_path']; + } /* Disabled the path extension if($data['new']['redirect_type'] == 'no' && substr($data['new']['redirect_path'],0,4) != 'http') { $data['new']['redirect_path'] = $data['new']['document_root'].'/web'.realpath($data['new']['redirect_path']).'/'; } */ - $rewrite_rules[] = array( 'rewrite_domain' => $alias['domain'], - 'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']', - 'rewrite_target' => $alias['redirect_path']); + switch($alias['subdomain']) { case 'www': - $rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$alias['domain'], + $rewrite_rules[] = array( 'rewrite_domain' => '^'.$alias['domain'], + 'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']', + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); + $rewrite_rules[] = array( 'rewrite_domain' => '^www.'.$alias['domain'], 'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']', - 'rewrite_target' => $alias['redirect_path']); + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); break; case '*': - // TODO - //$rewrite_rules[] = array( 'rewrite_domain' => '*'.$alias['domain'], - // 'rewrite_type' => $alias['redirect_type'], - // 'rewrite_target' => $alias['redirect_path']); + $rewrite_rules[] = array( 'rewrite_domain' => $alias['domain'], + 'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']', + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); break; + default: + $rewrite_rules[] = array( 'rewrite_domain' => '^'.$alias['domain'], + 'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']', + 'rewrite_target' => $rewrite_target, + 'rewrite_target_ssl' => $rewrite_target_ssl); } } } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index cd154f34d5..24b83b27c7 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -650,7 +650,6 @@ class nginx_plugin { $domain = $data['new']['ssl_domain']; $key_file = $ssl_dir.'/'.$domain.'.key'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; - //$bundle_file = $ssl_dir.'/'.$domain.'.bundle'; if($domain!='' && $data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file) && (@filesize($crt_file)>0) && (@filesize($key_file)>0)) { $vhost_data['ssl_enabled'] = 1; @@ -660,9 +659,21 @@ class nginx_plugin { $app->log('SSL Disabled. '.$domain,LOGLEVEL_DEBUG); } - //if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1; - - //$vhost_data['document_root'] = $data['new']['document_root'].'/web'; + // Set SEO Redirect + if($data['new']['seo_redirect'] != '' && ($data['new']['subdomain'] == 'www' || $data['new']['subdomain'] == '*')){ + $vhost_data['seo_redirect_enabled'] = 1; + if($data['new']['seo_redirect'] == 'non_www_to_www'){ + $vhost_data['seo_redirect_origin_domain'] = $data['new']['domain']; + $vhost_data['seo_redirect_target_domain'] = 'www.'.$data['new']['domain']; + } + if($data['new']['seo_redirect'] == 'www_to_non_www'){ + $vhost_data['seo_redirect_origin_domain'] = 'www.'.$data['new']['domain']; + $vhost_data['seo_redirect_target_domain'] = $data['new']['domain']; + } + } else { + $vhost_data['seo_redirect_enabled'] = 0; + } + $tpl->setVar($vhost_data); // Rewrite rules @@ -723,7 +734,9 @@ class nginx_plugin { $app->log('Add server alias: '.$alias['domain'],LOGLEVEL_DEBUG); // Rewriting if($alias['redirect_type'] != '') { - if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/'; + if(substr($alias['redirect_path'],-1) != '/') $alias['redirect_path'] .= '/'; + if(substr($alias['redirect_path'],0,8) == '[scheme]') $alias['redirect_path'] = '$scheme'.substr($alias['redirect_path'],8); + /* Disabled the path extension if($data['new']['redirect_type'] == 'no' && substr($data['new']['redirect_path'],0,4) != 'http') { $data['new']['redirect_path'] = $data['new']['document_root'].'/web'.realpath($data['new']['redirect_path']).'/'; -- GitLab