Newer
Older
$use_tcp = 0;
$use_socket = 1;
} else {
$use_tcp = 1;
$use_socket = 0;
}
$tpl->setVar('use_tcp', $use_tcp);
$tpl->setVar('use_socket', $use_socket);
$fpm_socket = $socket_dir.$pool_name.'.sock';
$tpl->setVar('fpm_socket', $fpm_socket);
$tpl->setVar('rnd_php_dummy_file', '/'.md5(uniqid(microtime(), 1)).'.htm');
$vhost_data['fpm_port'] = $web_config['php_fpm_start_port'] + $data['new']['domain_id'] - 1;
// backwards compatibility; since ISPConfig 3.0.5, the PHP mode for nginx is called 'php-fpm' instead of 'fast-cgi'. The following line makes sure that old web sites that have 'fast-cgi' in the database still get PHP-FPM support.
if($vhost_data['php'] == 'fast-cgi') $vhost_data['php'] = 'php-fpm';
// Custom rewrite rules
/*
$final_rewrite_rules = array();
$custom_rewrite_rules = $data['new']['rewrite_rules'];
// Make sure we only have Unix linebreaks
$custom_rewrite_rules = str_replace("\r\n", "\n", $custom_rewrite_rules);
$custom_rewrite_rules = str_replace("\r", "\n", $custom_rewrite_rules);
$custom_rewrite_rule_lines = explode("\n", $custom_rewrite_rules);
if(is_array($custom_rewrite_rule_lines) && !empty($custom_rewrite_rule_lines)){
foreach($custom_rewrite_rule_lines as $custom_rewrite_rule_line){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
}
}
$tpl->setLoop('rewrite_rules', $final_rewrite_rules);
*/
// Custom rewrite rules
$final_rewrite_rules = array();
if(isset($data['new']['rewrite_rules']) && trim($data['new']['rewrite_rules']) != '') {
$custom_rewrite_rules = trim($data['new']['rewrite_rules']);
$custom_rewrites_are_valid = true;
// use this counter to make sure all curly brackets are properly closed
$if_level = 0;
// Make sure we only have Unix linebreaks
$custom_rewrite_rules = str_replace("\r\n", "\n", $custom_rewrite_rules);
$custom_rewrite_rules = str_replace("\r", "\n", $custom_rewrite_rules);
$custom_rewrite_rule_lines = explode("\n", $custom_rewrite_rules);
if(is_array($custom_rewrite_rule_lines) && !empty($custom_rewrite_rule_lines)){
foreach($custom_rewrite_rule_lines as $custom_rewrite_rule_line){
// ignore comments
if(substr(ltrim($custom_rewrite_rule_line), 0, 1) == '#'){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
// empty lines
if(trim($custom_rewrite_rule_line) == ''){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
// rewrite
if(preg_match('@^\s*rewrite\s+(^/)?\S+(\$)?\s+\S+(\s+(last|break|redirect|permanent|))?\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
Falko Timme
committed
if(preg_match('@^\s*rewrite\s+(^/)?(\'[^\']+\'|"[^"]+")+(\$)?\s+(\'[^\']+\'|"[^"]+")+(\s+(last|break|redirect|permanent|))?\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
if(preg_match('@^\s*rewrite\s+(^/)?(\'[^\']+\'|"[^"]+")+(\$)?\s+\S+(\s+(last|break|redirect|permanent|))?\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
if(preg_match('@^\s*rewrite\s+(^/)?\S+(\$)?\s+(\'[^\']+\'|"[^"]+")+(\s+(last|break|redirect|permanent|))?\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
// if
if(preg_match('@^\s*if\s+\(\s*\$\S+(\s+(\!?(=|~|~\*))\s+(\S+|\".+\"))?\s*\)\s*\{\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
$if_level += 1;
continue;
}
// if - check for files, directories, etc.
if(preg_match('@^\s*if\s+\(\s*\!?-(f|d|e|x)\s+\S+\s*\)\s*\{\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
$if_level += 1;
continue;
}
// break
if(preg_match('@^\s*break\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
// return code [ text ]
if(preg_match('@^\s*return\s+\d\d\d.*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
// return code URL
// return URL
if(preg_match('@^\s*return(\s+\d\d\d)?\s+(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*\@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
// set
if(preg_match('@^\s*set\s+\$\S+\s+\S+\s*;\s*$@', $custom_rewrite_rule_line)){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
continue;
}
// closing curly bracket
if(trim($custom_rewrite_rule_line) == '}'){
$final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
$if_level -= 1;
continue;
}
$custom_rewrites_are_valid = false;
break;
}
}
if(!$custom_rewrites_are_valid || $if_level != 0){
$final_rewrite_rules = array();
}
}
$tpl->setLoop('rewrite_rules', $final_rewrite_rules);
// Custom nginx directives
$final_nginx_directives = array();
Falko Timme
committed
if(intval($data['new']['directive_snippets_id']) > 0){
$snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'nginx' AND active = 'y' AND customer_viewable = 'y'", $data['new']['directive_snippets_id']);
Falko Timme
committed
if(isset($snippet['snippet'])){
$nginx_directives = $snippet['snippet'];
} else {
$nginx_directives = $data['new']['nginx_directives'];
}
if($data['new']['enable_pagespeed'] == 'y'){
// if PageSpeed is already enabled, don't add configuration again
if(stripos($nginx_directives, 'pagespeed') !== false){
$vhost_data['enable_pagespeed'] = false;
} else {
$vhost_data['enable_pagespeed'] = true;
}
} else {
$vhost_data['enable_pagespeed'] = false;
}
Falko Timme
committed
} else {
$nginx_directives = $data['new']['nginx_directives'];
Falko Timme
committed
}
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
// folder_directive_snippets
if(trim($data['new']['folder_directive_snippets']) != ''){
$data['new']['folder_directive_snippets'] = trim($data['new']['folder_directive_snippets']);
$data['new']['folder_directive_snippets'] = str_replace("\r\n", "\n", $data['new']['folder_directive_snippets']);
$data['new']['folder_directive_snippets'] = str_replace("\r", "\n", $data['new']['folder_directive_snippets']);
$folder_directive_snippets_lines = explode("\n", $data['new']['folder_directive_snippets']);
if(is_array($folder_directive_snippets_lines) && !empty($folder_directive_snippets_lines)){
foreach($folder_directive_snippets_lines as $folder_directive_snippets_line){
list($folder_directive_snippets_folder, $folder_directive_snippets_snippets_id) = explode(':', $folder_directive_snippets_line);
$folder_directive_snippets_folder = trim($folder_directive_snippets_folder);
$folder_directive_snippets_snippets_id = trim($folder_directive_snippets_snippets_id);
if($folder_directive_snippets_folder != '' && intval($folder_directive_snippets_snippets_id) > 0 && preg_match('@^((?!(.*\.\.)|(.*\./)|(.*//))[^/][\w/_\.\-]{1,100})?$@', $folder_directive_snippets_folder)){
if(substr($folder_directive_snippets_folder, -1) != '/') $folder_directive_snippets_folder .= '/';
if(substr($folder_directive_snippets_folder, 0, 1) == '/') $folder_directive_snippets_folder = substr($folder_directive_snippets_folder, 1);
$master_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'nginx' AND active = 'y' AND customer_viewable = 'y'", intval($folder_directive_snippets_snippets_id));
if(isset($master_snippet['snippet'])){
$folder_directive_snippets_trans = array('{FOLDER}' => $folder_directive_snippets_folder, '{FOLDERMD5}' => md5($folder_directive_snippets_folder));
$master_snippet['snippet'] = strtr($master_snippet['snippet'], $folder_directive_snippets_trans);
$nginx_directives .= "\n\n".$master_snippet['snippet'];
// create folder it it does not exist
if(!is_dir($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder)){
$app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder);
$app->system->chown($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder, $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder, $groupname);
}
}
}
}
}
}
// use vLib for template logic
if(trim($nginx_directives) != '') {
$nginx_directives_new = '';
$ngx_conf_tpl = new tpl();
$ngx_conf_tpl_tmp_file = tempnam($conf['temppath'], "ngx");
file_put_contents($ngx_conf_tpl_tmp_file, $nginx_directives);
$ngx_conf_tpl->newTemplate($ngx_conf_tpl_tmp_file);
$ngx_conf_tpl->setVar('use_tcp', $use_tcp);
$ngx_conf_tpl->setVar('use_socket', $use_socket);
$ngx_conf_tpl->setVar('fpm_socket', $fpm_socket);
$ngx_conf_tpl->setVar($vhost_data);
$nginx_directives_new = $ngx_conf_tpl->grab();
if(is_file($ngx_conf_tpl_tmp_file)) unlink($ngx_conf_tpl_tmp_file);
if($nginx_directives_new != '') $nginx_directives = $nginx_directives_new;
unset($nginx_directives_new);
}
// Make sure we only have Unix linebreaks
$nginx_directives = str_replace("\r\n", "\n", $nginx_directives);
$nginx_directives = str_replace("\r", "\n", $nginx_directives);
$nginx_directive_lines = explode("\n", $nginx_directives);
if(is_array($nginx_directive_lines) && !empty($nginx_directive_lines)){
$trans = array(
'{DOCROOT}' => $vhost_data['web_document_root_www'],
'{DOCROOT_CLIENT}' => $vhost_data['web_document_root'],
'{FASTCGIPASS}' => 'fastcgi_pass '.($data['new']['php_fpm_use_socket'] == 'y'? 'unix:'.$fpm_socket : '127.0.0.1:'.$vhost_data['fpm_port']).';'
);
foreach($nginx_directive_lines as $nginx_directive_line){
Falko Timme
committed
$final_nginx_directives[] = array('nginx_directive' => strtr($nginx_directive_line, $trans));
}
}
$tpl->setLoop('nginx_directives', $final_nginx_directives);
// Check if a SSL cert exists
$ssl_dir = $data['new']['document_root'].'/ssl';
$domain = $data['new']['ssl_domain'];
if(!$domain) $domain = $data['new']['domain'];
$tpl->setVar('ssl_domain', $domain);
$key_file = $ssl_dir.'/'.$domain.'.key';
$key_file2 = $ssl_dir.'/'.$domain.'.key.org';
$csr_file = $ssl_dir.'/'.$domain.'.csr';
$crt_file = $ssl_dir.'/'.$domain.'.crt';
$tpl->setVar('ssl_letsencrypt', "n");
if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y') {
$domain = $data['new']['domain'];
if(substr($domain, 0, 2) === '*.') {
// wildcard domain not yet supported by letsencrypt!
$app->log('Wildcard domains not yet supported by letsencrypt, so changing ' . $domain . ' to ' . substr($domain, 2), LOGLEVEL_WARN);
$domain = substr($domain, 2);
}
$data['new']['ssl_domain'] = $domain;
$vhost_data['ssl_domain'] = $domain;
$key_file = $ssl_dir.'/'.$domain.'-le.key';
$key_file2 = $ssl_dir.'/'.$domain.'-le.key.org';
$crt_file = $ssl_dir.'/'.$domain.'-le.crt';
$bundle_file = $ssl_dir.'/'.$domain.'-le.bundle';
}
$vhost_data['ssl_crt_file'] = $crt_file;
$vhost_data['ssl_key_file'] = $key_file;
$vhost_data['ssl_bundle_file'] = $bundle_file;
//* Generate Let's Encrypt SSL certificat
if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y' && ( // ssl and let's encrypt is active
($data['old']['ssl'] == 'n' || $data['old']['ssl_letsencrypt'] == 'n') // we have new let's encrypt configuration
|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
|| $this->update_letsencrypt == true
)) {
Marius Burkard
committed
$temp_domains = array($domain);
$lddomain = '';
//* be sure to have good domain
if(substr($domain,0,4) != 'www.' && ($data['new']['subdomain'] == "www" OR $data['new']['subdomain'] == "*")) {
}
//* then, add subdomain if we have
$subdomains = $app->db->queryAllRecords('SELECT domain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'subdomain'");
if(is_array($subdomains)) {
foreach($subdomains as $subdomain) {
$temp_domains[] = $subdomain['domain'];
$sub_prefixes[] = str_replace($domain, "", $subdomain['domain']);
//* then, add alias domain if we have
$aliasdomains = $app->db->queryAllRecords('SELECT domain,subdomain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'alias'");
if(is_array($aliasdomains)) {
foreach($aliasdomains as $aliasdomain) {
$temp_domains[] = $aliasdomain['domain'];
Till Brehm
committed
if(isset($aliasdomain['subdomain']) && substr($aliasdomain['domain'],0,4) != 'www.' && ($aliasdomain['subdomain'] == "www" OR $aliasdomain['subdomain'] == "*")) {
$temp_domains[] = "www." . $aliasdomain['domain'];
foreach($sub_prefixes as $s) {
$temp_domains[] = $s . $aliasdomain['domain'];
}
// prevent duplicate
$temp_domains = array_unique($temp_domains);
Marius Burkard
committed
// check if domains are reachable to avoid letsencrypt verification errors
$le_rnd_file = uniqid('le-') . '.txt';
$le_rnd_hash = md5(uniqid('le-', true));
file_put_contents('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/' . $le_rnd_file, $le_rnd_hash);
$le_domains = array();
foreach($temp_domains as $temp_domain) {
if(isset($web_config['skip_le_check']) && $web_config['skip_le_check'] == 'y') {
Marius Burkard
committed
$le_domains[] = $temp_domain;
} else {
$le_hash_check = trim(@file_get_contents('http://' . $temp_domain . '/.well-known/acme-challenge/' . $le_rnd_file));
if($le_hash_check == $le_rnd_hash) {
$le_domains[] = $temp_domain;
$app->log("Verified domain " . $temp_domain . " should be reachable for letsencrypt.", LOGLEVEL_DEBUG);
} else {
$app->log("Could not verify domain " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN);
}
Marius Burkard
committed
}
}
$temp_domains = $le_domains;
unset($le_domains);
@unlink('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/' . $le_rnd_file);
// generate cli format
foreach($temp_domains as $temp_domain) {
$lddomain .= (string) " --domains " . $temp_domain;
}
// useless data
unset($subdomains);
unset($temp_domains);
$tpl->setVar('ssl_letsencrypt', "y");
//* TODO: check dns entry is correct
$crt_tmp_file = "/etc/letsencrypt/live/".$domain."/fullchain.pem";
$key_tmp_file = "/etc/letsencrypt/live/".$domain."/privkey.pem";
if(!is_dir("/etc/letsencrypt/live/".$domain)) {
$crt_tmp_file = "/etc/letsencrypt/live/www.".$domain."/fullchain.pem";
$key_tmp_file = "/etc/letsencrypt/live/www.".$domain."/privkey.pem";
}
$webroot = $data['new']['document_root']."/web";
//* check if we have already a Let's Encrypt cert
//if(!file_exists($crt_tmp_file) && !file_exists($key_tmp_file)) {
// we must not skip if cert exists, otherwise changed domains (alias or sub) won't make it to the cert
if(!empty($lddomain)) {
$app->log("Create Let's Encrypt SSL Cert for: $domain", LOGLEVEL_DEBUG);
$app->log("Let's Encrypt SSL Cert domains: $lddomain", LOGLEVEL_DEBUG);
}
Marius Burkard
committed
$success = false;
$letsencrypt = explode("\n", shell_exec('which letsencrypt certbot /root/.local/share/letsencrypt/bin/letsencrypt'));
$letsencrypt = reset($letsencrypt);
if(is_executable($letsencrypt) && !empty($lddomain)) {
Marius Burkard
committed
$success = $this->_exec($letsencrypt . " certonly -n --text --agree-tos --expand --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
Marius Burkard
committed
if(!$success) {
// error issuing cert
$app->log('Let\'s Encrypt SSL Cert for: ' . $domain . ' could not be issued.', LOGLEVEL_WARN);
$data['new']['ssl_letsencrypt'] = 'n';
if($data['old']['ssl'] == 'n') $data['new']['ssl'] = 'n';
/* Update the DB of the (local) Server */
$app->db->query("UPDATE web_domain SET `ssl` = ?, `ssl_letsencrypt` = ? WHERE `domain` = ?", $data['new']['ssl'], 'n', $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
$app->dbmaster->query("UPDATE web_domain SET `ssl` = ?, `ssl_letsencrypt` = ? WHERE `domain` = ?", $data['new']['ssl'], 'n', $data['new']['domain']);
}
//}
//* check is been correctly created
if(file_exists($crt_tmp_file)) {
$date = date("YmdHis");
//* TODO: check if is a symlink, if target same keep it, either remove it
if(is_file($key_file)) {
$app->system->copy($key_file, $key_file.'.old.'.$date);
$app->system->chmod($key_file.'.old.'.$date, 0400);
$app->system->unlink($key_file);
}
if ($web_config["website_symlinks_rel"] == 'y') {
$this->create_relative_link(escapeshellcmd($key_tmp_file), escapeshellcmd($key_file));
} else {
if(@is_link($key_file)) $app->system->unlink($key_file);
if(@file_exists($key_tmp_file)) exec("ln -s ".escapeshellcmd($key_tmp_file)." ".escapeshellcmd($key_file));
}
if(is_file($crt_file)) {
$app->system->copy($crt_file, $crt_file.'.old.'.$date);
$app->system->chmod($crt_file.'.old.'.$date, 0400);
$app->system->unlink($crt_file);
}
if($web_config["website_symlinks_rel"] == 'y') {
$this->create_relative_link(escapeshellcmd($crt_tmp_file), escapeshellcmd($crt_file));
} else {
if(@is_link($crt_file)) $app->system->unlink($crt_file);
if(@file_exists($crt_tmp_file))exec("ln -s ".escapeshellcmd($crt_tmp_file)." ".escapeshellcmd($crt_file));
}
/* we don't need to store it.
/* Update the DB of the (local) Server */
Marius Burkard
committed
$app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '', ssl_key = '' WHERE domain = ?", $data['new']['domain']);
$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
Marius Burkard
committed
$app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '', ssl_key = '' WHERE domain = ?", $data['new']['domain']);
$app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
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;
$app->log('Enable SSL for: '.$domain, LOGLEVEL_DEBUG);
} else {
$vhost_data['ssl_enabled'] = 0;
$app->log('SSL Disabled. '.$domain, LOGLEVEL_DEBUG);
}
// Set SEO Redirect
if($data['new']['seo_redirect'] != ''){
$vhost_data['seo_redirect_enabled'] = 1;
$tmp_seo_redirects = $this->get_seo_redirects($data['new']);
if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
foreach($tmp_seo_redirects as $key => $val){
$vhost_data[$key] = $val;
}
} else {
$vhost_data['seo_redirect_enabled'] = 0;
}
} else {
$vhost_data['seo_redirect_enabled'] = 0;
}
// Rewrite rules
$own_rewrite_rules = array();
$rewrite_rules = array();
$local_rewrite_rules = array();
if($data['new']['redirect_type'] != '' && $data['new']['redirect_path'] != '') {
if(substr($data['new']['redirect_path'], -1) != '/') $data['new']['redirect_path'] .= '/';
if(substr($data['new']['redirect_path'], 0, 8) == '[scheme]'){
if($data['new']['redirect_type'] != 'proxy'){
$data['new']['redirect_path'] = '$scheme'.substr($data['new']['redirect_path'], 8);
} else {
$data['new']['redirect_path'] = 'http'.substr($data['new']['redirect_path'], 8);
}
}
// Custom proxy directives
if($data['new']['redirect_type'] == 'proxy' && trim($data['new']['proxy_directives'] != '')){
$final_proxy_directives = array();
$proxy_directives = $data['new']['proxy_directives'];
// Make sure we only have Unix linebreaks
$proxy_directives = str_replace("\r\n", "\n", $proxy_directives);
$proxy_directives = str_replace("\r", "\n", $proxy_directives);
$proxy_directive_lines = explode("\n", $proxy_directives);
if(is_array($proxy_directive_lines) && !empty($proxy_directive_lines)){
foreach($proxy_directive_lines as $proxy_directive_line){
$final_proxy_directives[] = array('proxy_directive' => $proxy_directive_line);
}
}
} else {
$final_proxy_directives = false;
}
switch($data['new']['subdomain']) {
case 'www':
$exclude_own_hostname = '';
if(substr($data['new']['redirect_path'], 0, 1) == '/'){ // relative path
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
$vhost_data['web_document_root_www'] .= substr($data['new']['redirect_path'], 0, -1);
break;
}
$rewrite_exclude = '(?!/\b('.substr($data['new']['redirect_path'], 1, -1).(substr($data['new']['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
} else { // URL - check if URL is local
$tmp_redirect_path = $data['new']['redirect_path'];
if(substr($tmp_redirect_path, 0, 7) == '$scheme') $tmp_redirect_path = 'http'.substr($tmp_redirect_path, 7);
$tmp_redirect_path_parts = parse_url($tmp_redirect_path);
if(($tmp_redirect_path_parts['host'] == $data['new']['domain'] || $tmp_redirect_path_parts['host'] == 'www.'.$data['new']['domain']) && ($tmp_redirect_path_parts['port'] == '80' || $tmp_redirect_path_parts['port'] == '443' || !isset($tmp_redirect_path_parts['port']))){
// URL is local
if(substr($tmp_redirect_path_parts['path'], -1) == '/') $tmp_redirect_path_parts['path'] = substr($tmp_redirect_path_parts['path'], 0, -1);
if(substr($tmp_redirect_path_parts['path'], 0, 1) != '/') $tmp_redirect_path_parts['path'] = '/'.$tmp_redirect_path_parts['path'];
//$rewrite_exclude = '((?!'.$tmp_redirect_path_parts['path'].'))';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
$vhost_data['web_document_root_www'] .= $tmp_redirect_path_parts['path'];
break;
} else {
$rewrite_exclude = '(?!/\b('.substr($tmp_redirect_path_parts['path'], 1).(substr($tmp_redirect_path_parts['path'], 1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
$exclude_own_hostname = $tmp_redirect_path_parts['host'];
}
} else {
// external URL
$rewrite_exclude = '(.?)/';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['use_proxy'] = 'y';
$rewrite_subdir = $tmp_redirect_path_parts['path'];
if(substr($rewrite_subdir, 0, 1) == '/') $rewrite_subdir = substr($rewrite_subdir, 1);
if(substr($rewrite_subdir, -1) != '/') $rewrite_subdir .= '/';
if($rewrite_subdir == '/') $rewrite_subdir = '';
}
}
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
unset($tmp_redirect_path);
unset($tmp_redirect_path_parts);
}
$own_rewrite_rules[] = array( 'rewrite_domain' => '^'.$this->_rewrite_quote($data['new']['domain']),
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
'rewrite_target' => $data['new']['redirect_path'],
'rewrite_exclude' => $rewrite_exclude,
'rewrite_subdir' => $rewrite_subdir,
'exclude_own_hostname' => $exclude_own_hostname,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($data['new']['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($data['new']['redirect_type'] == 'proxy' ? true:false));
break;
case '*':
$exclude_own_hostname = '';
if(substr($data['new']['redirect_path'], 0, 1) == '/'){ // relative path
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
$vhost_data['web_document_root_www'] .= substr($data['new']['redirect_path'], 0, -1);
break;
}
$rewrite_exclude = '(?!/\b('.substr($data['new']['redirect_path'], 1, -1).(substr($data['new']['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
} else { // URL - check if URL is local
$tmp_redirect_path = $data['new']['redirect_path'];
if(substr($tmp_redirect_path, 0, 7) == '$scheme') $tmp_redirect_path = 'http'.substr($tmp_redirect_path, 7);
$tmp_redirect_path_parts = parse_url($tmp_redirect_path);
//if($is_serveralias && ($tmp_redirect_path_parts['port'] == '80' || $tmp_redirect_path_parts['port'] == '443' || !isset($tmp_redirect_path_parts['port']))){
if($this->url_is_local($tmp_redirect_path_parts['host'], $data['new']['domain_id']) && ($tmp_redirect_path_parts['port'] == '80' || $tmp_redirect_path_parts['port'] == '443' || !isset($tmp_redirect_path_parts['port']))){
// URL is local
if(substr($tmp_redirect_path_parts['path'], -1) == '/') $tmp_redirect_path_parts['path'] = substr($tmp_redirect_path_parts['path'], 0, -1);
if(substr($tmp_redirect_path_parts['path'], 0, 1) != '/') $tmp_redirect_path_parts['path'] = '/'.$tmp_redirect_path_parts['path'];
//$rewrite_exclude = '((?!'.$tmp_redirect_path_parts['path'].'))';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
$vhost_data['web_document_root_www'] .= $tmp_redirect_path_parts['path'];
break;
} else {
$rewrite_exclude = '(?!/\b('.substr($tmp_redirect_path_parts['path'], 1).(substr($tmp_redirect_path_parts['path'], 1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
$exclude_own_hostname = $tmp_redirect_path_parts['host'];
}
} else {
// external URL
$rewrite_exclude = '(.?)/';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['use_proxy'] = 'y';
$rewrite_subdir = $tmp_redirect_path_parts['path'];
if(substr($rewrite_subdir, 0, 1) == '/') $rewrite_subdir = substr($rewrite_subdir, 1);
if(substr($rewrite_subdir, -1) != '/') $rewrite_subdir .= '/';
if($rewrite_subdir == '/') $rewrite_subdir = '';
}
}
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
unset($tmp_redirect_path);
unset($tmp_redirect_path_parts);
}
$own_rewrite_rules[] = array( 'rewrite_domain' => '(^|\.)'.$this->_rewrite_quote($data['new']['domain']),
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
'rewrite_target' => $data['new']['redirect_path'],
'rewrite_exclude' => $rewrite_exclude,
'rewrite_subdir' => $rewrite_subdir,
'exclude_own_hostname' => $exclude_own_hostname,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($data['new']['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($data['new']['redirect_type'] == 'proxy' ? true:false));
break;
default:
if(substr($data['new']['redirect_path'], 0, 1) == '/'){ // relative path
$exclude_own_hostname = '';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
$vhost_data['web_document_root_www'] .= substr($data['new']['redirect_path'], 0, -1);
break;
}
$rewrite_exclude = '(?!/\b('.substr($data['new']['redirect_path'], 1, -1).(substr($data['new']['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
} else { // URL - check if URL is local
$tmp_redirect_path = $data['new']['redirect_path'];
if(substr($tmp_redirect_path, 0, 7) == '$scheme') $tmp_redirect_path = 'http'.substr($tmp_redirect_path, 7);
$tmp_redirect_path_parts = parse_url($tmp_redirect_path);
if($tmp_redirect_path_parts['host'] == $data['new']['domain'] && ($tmp_redirect_path_parts['port'] == '80' || $tmp_redirect_path_parts['port'] == '443' || !isset($tmp_redirect_path_parts['port']))){
// URL is local
if(substr($tmp_redirect_path_parts['path'], -1) == '/') $tmp_redirect_path_parts['path'] = substr($tmp_redirect_path_parts['path'], 0, -1);
if(substr($tmp_redirect_path_parts['path'], 0, 1) != '/') $tmp_redirect_path_parts['path'] = '/'.$tmp_redirect_path_parts['path'];
//$rewrite_exclude = '((?!'.$tmp_redirect_path_parts['path'].'))';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['web_document_root_www_proxy'] = 'root '.$vhost_data['web_document_root_www'].';';
$vhost_data['web_document_root_www'] .= $tmp_redirect_path_parts['path'];
break;
} else {
$rewrite_exclude = '(?!/\b('.substr($tmp_redirect_path_parts['path'], 1).(substr($tmp_redirect_path_parts['path'], 1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
$exclude_own_hostname = $tmp_redirect_path_parts['host'];
}
} else {
// external URL
$rewrite_exclude = '(.?)/';
if($data['new']['redirect_type'] == 'proxy'){
$vhost_data['use_proxy'] = 'y';
$rewrite_subdir = $tmp_redirect_path_parts['path'];
if(substr($rewrite_subdir, 0, 1) == '/') $rewrite_subdir = substr($rewrite_subdir, 1);
if(substr($rewrite_subdir, -1) != '/') $rewrite_subdir .= '/';
if($rewrite_subdir == '/') $rewrite_subdir = '';
}
}
unset($tmp_redirect_path);
unset($tmp_redirect_path_parts);
}
$own_rewrite_rules[] = array( 'rewrite_domain' => '^'.$this->_rewrite_quote($data['new']['domain']),
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
'rewrite_target' => $data['new']['redirect_path'],
'rewrite_exclude' => $rewrite_exclude,
'rewrite_subdir' => $rewrite_subdir,
'exclude_own_hostname' => $exclude_own_hostname,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($data['new']['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($data['new']['redirect_type'] == 'proxy' ? true:false));
}
}
// http2 or spdy?
$vhost_data['enable_http2'] = 'n';
if($vhost_data['enable_spdy'] == 'y'){
// check if nginx support http_v2; if so, use that instead of spdy
exec("2>&1 nginx -V | tr -- - '\n' | grep http_v2_module", $tmp_output, $tmp_retval);
if($tmp_retval == 0){
$vhost_data['enable_http2'] = 'y';
$vhost_data['enable_spdy'] = 'n';
}
unset($tmp_output, $tmp_retval);
}
$tpl->setVar($vhost_data);
$server_alias = array();
// get autoalias
$auto_alias = $web_config['website_autoalias'];
if($auto_alias != '') {
// get the client username
$client = $app->db->queryOneRecord("SELECT `username` FROM `client` WHERE `client_id` = ?", $client_id);
$aa_search = array('[client_id]', '[website_id]', '[client_username]', '[website_domain]');
$aa_replace = array($client_id, $data['new']['domain_id'], $client['username'], $data['new']['domain']);
$auto_alias = str_replace($aa_search, $aa_replace, $auto_alias);
unset($client);
unset($aa_search);
unset($aa_replace);
$server_alias[] .= $auto_alias.' ';
}
// get alias domains (co-domains and subdomains)
$aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ? AND active = 'y' AND (type != 'vhostsubdomain' AND type != 'vhostalias')", $data['new']['domain_id']);
$alias_seo_redirects = array();
switch($data['new']['subdomain']) {
case 'www':
$server_alias[] = 'www.'.$data['new']['domain'].' ';
break;
case '*':
$server_alias[] = '*.'.$data['new']['domain'].' ';
break;
}
if(is_array($aliases)) {
foreach($aliases as $alias) {
// Custom proxy directives
if($alias['redirect_type'] == 'proxy' && trim($alias['proxy_directives'] != '')){
$final_proxy_directives = array();
$proxy_directives = $alias['proxy_directives'];
// Make sure we only have Unix linebreaks
$proxy_directives = str_replace("\r\n", "\n", $proxy_directives);
$proxy_directives = str_replace("\r", "\n", $proxy_directives);
$proxy_directive_lines = explode("\n", $proxy_directives);
if(is_array($proxy_directive_lines) && !empty($proxy_directive_lines)){
foreach($proxy_directive_lines as $proxy_directive_line){
$final_proxy_directives[] = array('proxy_directive' => $proxy_directive_line);
}
}
} else {
$final_proxy_directives = false;
}
if($alias['redirect_type'] == '' || $alias['redirect_path'] == '' || substr($alias['redirect_path'], 0, 1) == '/') {
switch($alias['subdomain']) {
case 'www':
$server_alias[] = 'www.'.$alias['domain'].' '.$alias['domain'].' ';
break;
case '*':
$server_alias[] = '*.'.$alias['domain'].' '.$alias['domain'].' ';
break;
default:
$server_alias[] = $alias['domain'].' ';
break;
}
$app->log('Add server alias: '.$alias['domain'], LOGLEVEL_DEBUG);
// Add SEO redirects for alias domains
if($alias['seo_redirect'] != '' && $data['new']['seo_redirect'] != '*_to_www_domain_tld' && $data['new']['seo_redirect'] != '*_to_domain_tld' && ($alias['type'] == 'alias' || ($alias['type'] == 'subdomain' && $data['new']['seo_redirect'] != '*_domain_tld_to_www_domain_tld' && $data['new']['seo_redirect'] != '*_domain_tld_to_domain_tld'))){
$tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_');
if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
$alias_seo_redirects[] = $tmp_seo_redirects;
}
}
}
// Local Rewriting (inside vhost server {} container)
if($alias['redirect_type'] != '' && substr($alias['redirect_path'], 0, 1) == '/' && $alias['redirect_type'] != 'proxy') { // proxy makes no sense with local path
if(substr($alias['redirect_path'], -1) != '/') $alias['redirect_path'] .= '/';
$rewrite_exclude = '(?!/\b('.substr($alias['redirect_path'], 1, -1).(substr($alias['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').')\b)/';
switch($alias['subdomain']) {
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
case 'www':
// example.com
$local_rewrite_rules[] = array( 'local_redirect_origin_domain' => $alias['domain'],
'local_redirect_operator' => '=',
'local_redirect_exclude' => $rewrite_exclude,
'local_redirect_target' => $alias['redirect_path'],
'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
// www.example.com
$local_rewrite_rules[] = array( 'local_redirect_origin_domain' => 'www.'.$alias['domain'],
'local_redirect_operator' => '=',
'local_redirect_exclude' => $rewrite_exclude,
'local_redirect_target' => $alias['redirect_path'],
'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
break;
case '*':
$local_rewrite_rules[] = array( 'local_redirect_origin_domain' => '^('.str_replace('.', '\.', $alias['domain']).'|.+\.'.str_replace('.', '\.', $alias['domain']).')$',
'local_redirect_operator' => '~*',
'local_redirect_exclude' => $rewrite_exclude,
'local_redirect_target' => $alias['redirect_path'],
'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
break;
default:
$local_rewrite_rules[] = array( 'local_redirect_origin_domain' => $alias['domain'],
'local_redirect_operator' => '=',
'local_redirect_exclude' => $rewrite_exclude,
'local_redirect_target' => $alias['redirect_path'],
'local_redirect_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type']);
}
}
// External Rewriting (extra server {} containers)
if($alias['redirect_type'] != '' && $alias['redirect_path'] != '' && substr($alias['redirect_path'], 0, 1) != '/') {
if(substr($alias['redirect_path'], -1) != '/') $alias['redirect_path'] .= '/';
if(substr($alias['redirect_path'], 0, 8) == '[scheme]'){
if($alias['redirect_type'] != 'proxy'){
$alias['redirect_path'] = '$scheme'.substr($alias['redirect_path'], 8);
} else {
$alias['redirect_path'] = 'http'.substr($alias['redirect_path'], 8);
}
}
switch($alias['subdomain']) {
case 'www':
if($alias['redirect_type'] == 'proxy'){
$tmp_redirect_path = $alias['redirect_path'];
$tmp_redirect_path_parts = parse_url($tmp_redirect_path);
$rewrite_subdir = $tmp_redirect_path_parts['path'];
if(substr($rewrite_subdir, 0, 1) == '/') $rewrite_subdir = substr($rewrite_subdir, 1);
if(substr($rewrite_subdir, -1) != '/') $rewrite_subdir .= '/';
if($rewrite_subdir == '/') $rewrite_subdir = '';
}
if($alias['redirect_type'] != 'proxy'){
if(substr($alias['redirect_path'], -1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'], 0, -1);
}
// Add SEO redirects for alias domains
$alias_seo_redirects2 = array();
if($alias['seo_redirect'] != ''){
$tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_', 'none');
if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
$alias_seo_redirects2[] = $tmp_seo_redirects;
}
}
$rewrite_rules[] = array( 'rewrite_domain' => $alias['domain'],
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
'rewrite_target' => $alias['redirect_path'],
'rewrite_subdir' => $rewrite_subdir,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($alias['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($alias['redirect_type'] == 'proxy' ? true:false),
'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
// Add SEO redirects for alias domains
$alias_seo_redirects2 = array();
if($alias['seo_redirect'] != ''){
$tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_', 'www');
if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
$alias_seo_redirects2[] = $tmp_seo_redirects;
}
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
}
$rewrite_rules[] = array( 'rewrite_domain' => 'www.'.$alias['domain'],
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
'rewrite_target' => $alias['redirect_path'],
'rewrite_subdir' => $rewrite_subdir,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($alias['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($alias['redirect_type'] == 'proxy' ? true:false),
'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
break;
case '*':
if($alias['redirect_type'] == 'proxy'){
$tmp_redirect_path = $alias['redirect_path'];
$tmp_redirect_path_parts = parse_url($tmp_redirect_path);
$rewrite_subdir = $tmp_redirect_path_parts['path'];
if(substr($rewrite_subdir, 0, 1) == '/') $rewrite_subdir = substr($rewrite_subdir, 1);
if(substr($rewrite_subdir, -1) != '/') $rewrite_subdir .= '/';
if($rewrite_subdir == '/') $rewrite_subdir = '';
}
if($alias['redirect_type'] != 'proxy'){
if(substr($alias['redirect_path'], -1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'], 0, -1);
}
// Add SEO redirects for alias domains
$alias_seo_redirects2 = array();
if($alias['seo_redirect'] != ''){
$tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_');
if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
$alias_seo_redirects2[] = $tmp_seo_redirects;
}
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
}
$rewrite_rules[] = array( 'rewrite_domain' => $alias['domain'].' *.'.$alias['domain'],
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
'rewrite_target' => $alias['redirect_path'],
'rewrite_subdir' => $rewrite_subdir,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($alias['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($alias['redirect_type'] == 'proxy' ? true:false),
'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
break;
default:
if($alias['redirect_type'] == 'proxy'){
$tmp_redirect_path = $alias['redirect_path'];
$tmp_redirect_path_parts = parse_url($tmp_redirect_path);
$rewrite_subdir = $tmp_redirect_path_parts['path'];
if(substr($rewrite_subdir, 0, 1) == '/') $rewrite_subdir = substr($rewrite_subdir, 1);
if(substr($rewrite_subdir, -1) != '/') $rewrite_subdir .= '/';
if($rewrite_subdir == '/') $rewrite_subdir = '';
}
if($alias['redirect_type'] != 'proxy'){
if(substr($alias['redirect_path'], -1) == '/') $alias['redirect_path'] = substr($alias['redirect_path'], 0, -1);
}
if(substr($alias['domain'], 0, 2) === '*.') $domain_rule = '*.'.substr($alias['domain'], 2);
else $domain_rule = $alias['domain'];
// Add SEO redirects for alias domains
$alias_seo_redirects2 = array();
if($alias['seo_redirect'] != ''){
if(substr($alias['domain'], 0, 2) === '*.'){
$tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_');
} else {
$tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_', 'none');
}
if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
$alias_seo_redirects2[] = $tmp_seo_redirects;
}
}
$rewrite_rules[] = array( 'rewrite_domain' => $domain_rule,
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
'rewrite_target' => $alias['redirect_path'],
'rewrite_subdir' => $rewrite_subdir,
'proxy_directives' => $final_proxy_directives,
'use_rewrite' => ($alias['redirect_type'] == 'proxy' ? false:true),
'use_proxy' => ($alias['redirect_type'] == 'proxy' ? true:false),
'alias_seo_redirects2' => (count($alias_seo_redirects2) > 0 ? $alias_seo_redirects2 : false));
}
}
}
}
//* If we have some alias records
if(count($server_alias) > 0) {
$server_alias_str = '';
$n = 0;
foreach($server_alias as $tmp_alias) {
$server_alias_str .= $tmp_alias;
}
unset($tmp_alias);
$tpl->setVar('alias', trim($server_alias_str));
} else {
}
if(count($rewrite_rules) > 0) {
$tpl->setLoop('redirects', $rewrite_rules);
}
if(count($own_rewrite_rules) > 0) {
$tpl->setLoop('own_redirects', $own_rewrite_rules);
}
if(count($local_rewrite_rules) > 0) {
$tpl->setLoop('local_redirects', $local_rewrite_rules);
}
if(count($alias_seo_redirects) > 0) {
$tpl->setLoop('alias_seo_redirects', $alias_seo_redirects);
}
//* Create basic http auth for website statistics
$tpl->setVar('stats_auth_passwd_file', $data['new']['document_root']."/web/stats/.htpasswd_stats");
// Create basic http auth for other directories
$basic_auth_locations = $this->_create_web_folder_auth_configuration($data['new']);
if(is_array($basic_auth_locations) && !empty($basic_auth_locations)) $tpl->setLoop('basic_auth_locations', $basic_auth_locations);
$vhost_file = escapeshellcmd($web_config['nginx_vhost_conf_dir'].'/'.$data['new']['domain'].'.vhost');
//* Make a backup copy of vhost file
if(file_exists($vhost_file)) copy($vhost_file, $vhost_file.'~');
//* Write vhost file
$app->system->file_put_contents($vhost_file, $this->nginx_merge_locations($tpl->grab()));
$app->log('Writing the vhost file: '.$vhost_file, LOGLEVEL_DEBUG);
unset($tpl);
//* Set the symlink to enable the vhost
//* First we check if there is a old type of symlink and remove it
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/'.$data['new']['domain'].'.vhost');
if(is_link($vhost_symlink)) $app->system->unlink($vhost_symlink);
//* Remove old or changed symlinks
if($data['new']['subdomain'] != $data['old']['subdomain'] or $data['new']['active'] == 'n') {
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/900-'.$data['new']['domain'].'.vhost');
if(is_link($vhost_symlink)) {
$app->system->unlink($vhost_symlink);
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file, LOGLEVEL_DEBUG);
}
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/100-'.$data['new']['domain'].'.vhost');
if(is_link($vhost_symlink)) {
$app->system->unlink($vhost_symlink);
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file, LOGLEVEL_DEBUG);
}
}
//* New symlink
if($data['new']['subdomain'] == '*') {
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/900-'.$data['new']['domain'].'.vhost');
} else {
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/100-'.$data['new']['domain'].'.vhost');
}
if($data['new']['active'] == 'y' && !is_link($vhost_symlink)) {
symlink($vhost_file, $vhost_symlink);
$app->log('Creating symlink: '.$vhost_symlink.'->'.$vhost_file, LOGLEVEL_DEBUG);
}
// remove old symlink and vhost file, if domain name of the site has changed
if($this->action == 'update' && $data['old']['domain'] != '' && $data['new']['domain'] != $data['old']['domain']) {
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/900-'.$data['old']['domain'].'.vhost');
if(is_link($vhost_symlink)) {
$app->system->unlink($vhost_symlink);
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file, LOGLEVEL_DEBUG);
}
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/100-'.$data['old']['domain'].'.vhost');
if(is_link($vhost_symlink)) {
$app->system->unlink($vhost_symlink);
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file, LOGLEVEL_DEBUG);
}
$vhost_symlink = escapeshellcmd($web_config['nginx_vhost_conf_enabled_dir'].'/'.$data['old']['domain'].'.vhost');
if(is_link($vhost_symlink)) {
$app->system->unlink($vhost_symlink);
$app->log('Removing symlink: '.$vhost_symlink.'->'.$vhost_file, LOGLEVEL_DEBUG);
}
$vhost_file = escapeshellcmd($web_config['nginx_vhost_conf_dir'].'/'.$data['old']['domain'].'.vhost');
$app->system->unlink($vhost_file);
$app->log('Removing file: '.$vhost_file, LOGLEVEL_DEBUG);
}
// create password file for stats directory
if(!is_file($data['new']['document_root'].'/web/stats/.htpasswd_stats') || $data['new']['stats_password'] != $data['old']['stats_password']) {
if(trim($data['new']['stats_password']) != '') {
$htp_file = 'admin:'.trim($data['new']['stats_password']);
$app->system->file_put_contents($data['new']['document_root'].'/web/stats/.htpasswd_stats', $htp_file);
$app->system->chmod($data['new']['document_root'].'/web/stats/.htpasswd_stats', 0755);
unset($htp_file);
}
}
//* Create awstats configuration
if($data['new']['stats_type'] == 'awstats' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) {
$this->awstats_update($data, $web_config);
}
$this->php_fpm_pool_update($data, $web_config, $pool_dir, $pool_name, $socket_dir);
Marius Cramer
committed
$this->hhvm_update($data, $web_config);
if($web_config['check_apache_config'] == 'y') {
//* Test if nginx starts with the new configuration file
$nginx_online_status_before_restart = $this->_checkTcp('localhost', 80);
$app->log('nginx status is: '.($nginx_online_status_before_restart === true? 'running' : 'down'), LOGLEVEL_DEBUG);
$retval = $app->services->restartService('httpd', 'restart'); // $retval['retval'] is 0 on success and > 0 on failure
$app->log('nginx restart return value is: '.$retval['retval'], LOGLEVEL_DEBUG);
// wait a few seconds, before we test the apache status again
sleep(2);
//* Check if nginx restarted successfully if it was online before
$nginx_online_status_after_restart = $this->_checkTcp('localhost', 80);
$app->log('nginx online status after restart is: '.($nginx_online_status_after_restart === true? 'running' : 'down'), LOGLEVEL_DEBUG);
if($nginx_online_status_before_restart && !$nginx_online_status_after_restart || $retval['retval'] > 0) {
$app->log('nginx did not restart after the configuration change for website '.$data['new']['domain'].'. Reverting the configuration. Saved non-working config as '.$vhost_file.'.err', LOGLEVEL_WARN);
if(is_array($retval['output']) && !empty($retval['output'])){
$app->log('Reason for nginx restart failure: '.implode("\n", $retval['output']), LOGLEVEL_WARN);
$app->dbmaster->datalogError(implode("\n", $retval['output']));
} else {
// if no output is given, check again
exec('nginx -t 2>&1', $tmp_output, $tmp_retval);
if($tmp_retval > 0 && is_array($tmp_output) && !empty($tmp_output)){
$app->log('Reason for nginx restart failure: '.implode("\n", $tmp_output), LOGLEVEL_WARN);