Newer
Older
}
} elseif((($data['new']['type'] == 'vhostsubdomain') || ($data['new']['type'] == 'vhostalias')) &&
(($this->action == 'insert') || ($web_config['set_folder_permissions_on_update'] == 'y'))) {
if($web_config['security_level'] == 20) {
$app->system->chmod($data['new']['document_root'].'/' . $web_folder, 0710);
$app->system->chown($data['new']['document_root'].'/' . $web_folder, $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder, $groupname);
$app->system->chown($data['new']['document_root'].'/' . $web_folder . '/error', $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder . '/error', $groupname);
if($data['new']['stats_type'] != '') {
$app->system->chown($data['new']['document_root'].'/' . $web_folder . '/stats', $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder . '/stats', $groupname);
}
} else {
$app->system->chmod($data['new']['document_root'].'/' . $web_folder, 0755);
$app->system->chown($data['new']['document_root'].'/' . $web_folder, $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder, $groupname);
$app->system->chown($data['new']['document_root'].'/' . $web_folder . '/error', $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder . '/error', $groupname);
if($data['new']['stats_type'] != '') {
$app->system->chown($data['new']['document_root'].'/' . $web_folder . '/stats', $username);
$app->system->chgrp($data['new']['document_root'].'/' . $web_folder . '/stats', $groupname);
}
//* Protect web folders
$app->system->web_folder_protection($data['new']['document_root'], true);
if($data['new']['type'] == 'vhost') {
// Change the ownership of the error log to the root user
Marius Burkard
committed
if(!@is_file('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log')) $app->system->exec_safe('touch ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log');
$app->system->chown('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log', 'root');
$app->system->chgrp('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log', 'root');
}
//* Create the vhost config file
$app->load('tpl');
$tpl = new tpl();
$tpl->newTemplate('nginx_vhost.conf.master');
if($data['new']['ip_address'] == '') $data['new']['ip_address'] = '*';
//* use ip-mapping for web-mirror
if($data['new']['ip_address'] != '*' && $conf['mirror_server_id'] > 0) {
$sql = "SELECT destination_ip FROM server_ip_map WHERE server_id = ? AND source_ip = ?";
$newip = $app->db->queryOneRecord($sql, $conf['server_id'], $data['new']['ip_address']);
$data['new']['ip_address'] = $newip['destination_ip'];
unset($newip);
}
$vhost_data = $data['new'];
//unset($vhost_data['ip_address']);
$vhost_data['web_document_root'] = $data['new']['document_root'].'/' . $web_folder;
$vhost_data['web_document_root_www'] = $web_config['website_basedir'].'/'.$data['new']['domain'].'/' . $web_folder;
$vhost_data['web_basedir'] = $web_config['website_basedir'];
// IPv6
if($data['new']['ipv6_address'] != ''){
$tpl->setVar('ipv6_enabled', 1);
if ($conf['serverconfig']['web']['vhost_rewrite_v6'] == 'y') {
if (isset($conf['serverconfig']['server']['v6_prefix']) && $conf['serverconfig']['server']['v6_prefix'] <> '') {
$explode_v6prefix=explode(':', $conf['serverconfig']['server']['v6_prefix']);
$explode_v6=explode(':', $data['new']['ipv6_address']);
for ( $i = 0; $i <= count($explode_v6prefix)-1; $i++ ) {
$explode_v6[$i] = $explode_v6prefix[$i];
}
$data['new']['ipv6_address'] = implode(':', $explode_v6);
$vhost_data['ipv6_address'] = $data['new']['ipv6_address'];
}
}
}
if($data['new']['ip_address'] == '*' && $data['new']['ipv6_address'] == '') $tpl->setVar('ipv6_wildcard', 1);
if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){
if($data['new']['server_php_id'] != 0){
$default_php_fpm = false;
$tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']);
if($tmp_php) {
$custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir'];
$custom_php_fpm_init_script = $tmp_php['php_fpm_init_script'];
$custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir'];
if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/';
}
} else {
$default_php_fpm = true;
}
} else {
if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){
$default_php_fpm = false;
$tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']);
if($tmp_php) {
$custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir'];
$custom_php_fpm_init_script = $tmp_php['php_fpm_init_script'];
$custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir'];
if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/';
}
} else {
$default_php_fpm = true;
}
}
if($default_php_fpm){
Marius Burkard
committed
$pool_dir = $web_config['php_fpm_pool_dir'];
} else {
$pool_dir = $custom_php_fpm_pool_dir;
}
if(substr($pool_dir, -1) != '/') $pool_dir .= '/';
$pool_name = 'web'.$data['new']['domain_id'];
Marius Burkard
committed
$socket_dir = $web_config['php_fpm_socket_dir'];
if(substr($socket_dir, -1) != '/') $socket_dir .= '/';
if($data['new']['php_fpm_use_socket'] == 'y'){
$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);
$tpl->setVar('php_fpm_chroot', $data['new']['php_fpm_chroot']);
$tpl->setVar('php_fpm_chroot_web_folder', sprintf('/%s', trim($web_folder, '/')));
$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;
}
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
// 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();
Florian Schaal
committed
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
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'];
}
Florian Schaal
committed
/*
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;
}
Florian Schaal
committed
*/
Falko Timme
committed
} else {
$nginx_directives = $data['new']['nginx_directives'];
Florian Schaal
committed
// $vhost_data['enable_pagespeed'] = false;
Falko Timme
committed
}
if(!$nginx_directives) {
$nginx_directives = ''; // ensure it is not null
}
// 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'],
'{DOMAIN}' => $vhost_data['domain'],
'{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
$tmp = $app->letsencrypt->get_website_certificate_paths($data);
$domain = $tmp['domain'];
$key_file = $tmp['key'];
$key_file2 = $tmp['key2'];
$csr_file = $tmp['csr'];
$crt_file = $tmp['crt'];
$bundle_file = $tmp['bundle'];
unset($tmp);
$data['new']['ssl_domain'] = $domain;
$vhost_data['ssl_domain'] = $domain;
$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
Till Brehm
committed
if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y' && $conf['mirror_server_id'] == 0 && ( // ssl and let's encrypt is active and no mirror server
($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
)) {
$success = $app->letsencrypt->request_certificates($data, 'nginx');
if($success) {
/* 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']);
} else {
$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` = ? AND `server_id` = ?", $data['new']['ssl'], 'n', $data['new']['domain'], $conf['server_id']);
/* 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']);
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;
}
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($data['new']['redirect_path'], 1, -1).(substr($data['new']['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
} 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 {
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($tmp_redirect_path_parts['path'], 1).(substr($tmp_redirect_path_parts['path'], 1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
$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 = '';
}
}
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
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;
}
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($data['new']['redirect_path'], 1, -1).(substr($data['new']['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
} 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 {
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($tmp_redirect_path_parts['path'], 1).(substr($tmp_redirect_path_parts['path'], 1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
$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 = '';
}
}
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
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;
}
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($data['new']['redirect_path'], 1, -1).(substr($data['new']['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
} 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 {
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($tmp_redirect_path_parts['path'], 1).(substr($tmp_redirect_path_parts['path'], 1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
$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));
}
}
//proxy protocol settings
if($web_config['vhost_proxy_protocol_enabled'] == "y"){
if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) {
$vhost_data['use_proxy_protocol'] = $data['new']['proxy_protocol'];
$vhost_data['proxy_protocol_http'] = (int)$web_config['vhost_proxy_protocol_http_port'];
$vhost_data['proxy_protocol_https'] = (int)$web_config['vhost_proxy_protocol_https_port'];
} else {
$vhost_data['use_proxy_protocol'] = "n";
}
$vhost_data['use_proxy_protocol'] = "n";
// set logging variable
$vhost_data['logging'] = $web_config['logging'];
// check if OpenSSL and Nginx supports TLS 1.3
//$app->log("Found OpenSSL version: " . $app->system->getopensslversion($get_minor = true), LOGLEVEL_DEBUG);
$nginx_version = $app->system->getnginxversion(true);
$openssl_version = $app->system->getopensslversion(true);
Michael Seevogel
committed
$app->system->exec_safe('nginx -V 2>&1', $output, $return_var);
if(preg_match('/built with OpenSSL\s*(\d+)(\.(\d+)(\.(\d+))*)?(\D|$)/i', $output[0], $matches)) {
$nginx_openssl_ver = $matches[1] . (isset($matches[3]) ? '.' . $matches[3] : '') . (isset($matches[5]) ? '.' . $matches[5] : '');
}
if(version_compare($app->system->getopensslversion(true), $nginx_openssl_ver, '>=')) {
if((version_compare($app->system->getnginxversion(true), '1.13.0', '>=') && version_compare($app->system->getopensslversion(true), '1.1.1', '>='))) {
$app->log('Enable TLS 1.3 for: '.$domain, LOGLEVEL_DEBUG);
$vhost_data['tls13_available'] = $app->system->getopensslversion(true);
}
}
$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'] .= '/';
Marius Burkard
committed
$rewrite_exclude = '(?!/('.substr($alias['redirect_path'], 1, -1).(substr($alias['redirect_path'], 1, -1) != ''? '|': '').'stats'.($vhost_data['errordocs'] == 1 ? '|error' : '').'|\.well-known/acme-challenge))/';
switch($alias['subdomain']) {
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
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;
}
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
}
$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;
}
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
}
$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);
}
$stats_web_folder = 'web';
if($data['new']['type'] == 'vhost'){
if($data['new']['web_folder'] != ''){
if(substr($data['new']['web_folder'], 0, 1) == '/') $data['new']['web_folder'] = substr($data['new']['web_folder'],1);
if(substr($data['new']['web_folder'], -1) == '/') $data['new']['web_folder'] = substr($data['new']['web_folder'],0,-1);
}
$stats_web_folder .= '/'.$data['new']['web_folder'];
} elseif($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') {
$stats_web_folder = $data['new']['web_folder'];
}
//* Create basic http auth for website statistics
$tpl->setVar('stats_auth_passwd_file', $data['new']['document_root']."/" . $stats_web_folder . "/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);
Marius Burkard
committed
$vhost_file = $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
Marius Burkard
committed
$vhost_symlink = $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') {
Marius Burkard
committed
$vhost_symlink = $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);
}
Marius Burkard
committed
$vhost_symlink = $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'] == '*') {
Marius Burkard
committed
$vhost_symlink = $web_config['nginx_vhost_conf_enabled_dir'].'/900-'.$data['new']['domain'].'.vhost';
} else {
Marius Burkard
committed
$vhost_symlink = $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']) {
Marius Burkard
committed
$vhost_symlink = $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);
}
Marius Burkard
committed
$vhost_symlink = $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);
}
Marius Burkard
committed
$vhost_symlink = $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);
}
Marius Burkard
committed
$vhost_file = $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'].'/' . $stats_web_folder . '/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'].'/' . $stats_web_folder . '/stats/.htpasswd_stats', $htp_file);
$app->system->chmod($data['new']['document_root'].'/' . $stats_web_folder . '/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);
}