- Added "Rewrite Rules" field to the "Redirect" tab so that customers can set rewrite rules themselves on nginx.
1 files added
8 files modified
New file |
| | |
| | | ALTER TABLE `web_domain` ADD `rewrite_rules` MEDIUMTEXT NULL DEFAULT NULL; |
| | |
| | | `fastcgi_php_version` varchar(255) DEFAULT NULL, |
| | | `proxy_directives` mediumtext, |
| | | `last_quota_notification` date NULL default NULL, |
| | | `rewrite_rules` mediumtext, |
| | | PRIMARY KEY (`domain_id`) |
| | | ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; |
| | | |
| | |
| | | 'default' => '', |
| | | 'value' => array('' => 'no_redirect_txt', 'non_www_to_www' => 'domain.tld => www.domain.tld', 'www_to_non_www' => 'www.domain.tld => domain.tld', '*_domain_tld_to_domain_tld' => '*.doman.tld => domain.tld', '*_domain_tld_to_www_domain_tld' => '*.domain.tld => www.domain.tld', '*_to_domain_tld' => '* => domain.tld', '*_to_www_domain_tld' => '* => www.domain.tld') |
| | | ), |
| | | 'rewrite_rules' => array ( |
| | | 'datatype' => 'TEXT', |
| | | 'formtype' => 'TEXT', |
| | | 'default' => '', |
| | | 'value' => '', |
| | | 'width' => '30', |
| | | 'maxlength' => '255' |
| | | ), |
| | | ################################## |
| | | # ENDE Datatable fields |
| | | ################################## |
| | |
| | | $wb['daily_backup_txt'] = 'Täglich'; |
| | | $wb['weekly_backup_txt'] = 'Wöchentlich'; |
| | | $wb['monthly_backup_txt'] = 'Monatlich'; |
| | | $wb['rewrite_rules_txt'] = 'Rewrite Rules'; |
| | | $wb['invalid_rewrite_rules_txt'] = 'Unzulässige Rewrite Rules'; |
| | | ?> |
| | |
| | | $wb['daily_backup_txt'] = 'Daily'; |
| | | $wb['weekly_backup_txt'] = 'Weekly'; |
| | | $wb['monthly_backup_txt'] = 'Monthly'; |
| | | $wb['rewrite_rules_txt'] = 'Rewrite Rules'; |
| | | $wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; |
| | | ?> |
| | |
| | | {tmpl_var name='seo_redirect'} |
| | | </select> |
| | | </div> |
| | | <div class="ctrlHolder nginx"> |
| | | <label for="rewrite_rules">{tmpl_var name='rewrite_rules_txt'}</label> |
| | | <textarea name="rewrite_rules" id="rewrite_rules" rows='10' cols='50' style="width:400px;">{tmpl_var name='rewrite_rules'}</textarea> |
| | | </div> |
| | | </fieldset> |
| | | |
| | | <input type="hidden" name="id" value="{tmpl_var name='id'}"> |
| | |
| | | jQuery('#redirect_type option[value="R,L"]').hide(); |
| | | jQuery('#redirect_type option[value="R=301,L"]').hide(); |
| | | if(selected != "no" && selected != "" && selected != "last" && selected != "break" && selected != "redirect" && selected != "permanent" && selected != "proxy") jQuery('#redirect_type option[value="no"]').attr('selected', 'selected'); |
| | | jQuery('.nginx').show(); |
| | | } else { |
| | | jQuery('#redirect_type option[value="last"]').attr('disabled','disabled'); |
| | | jQuery('#redirect_type option[value="break"]').attr('disabled','disabled'); |
| | |
| | | jQuery('#redirect_type option[value="permanent"]').hide(); |
| | | jQuery('#redirect_type option[value="proxy"]').hide(); |
| | | if(selected != "no" && selected != "" && selected != "R" && selected != "L" && selected != "R,L" && selected != "R=301,L") jQuery('#redirect_type option[value="no"]').attr('selected', 'selected'); |
| | | jQuery('.nginx').hide(); |
| | | } |
| | | }); |
| | | } |
| | |
| | | |
| | | //* get the server config for this server |
| | | $app->uses("getconf"); |
| | | $web_config = $app->getconf->get_server_config($app->functions->intval(isset($this->dataRecord["server_id"]) ? $this->dataRecord["server_id"] : 0),'web'); |
| | | if($this->id > 0){ |
| | | $web_rec = $app->tform->getDataRecord($this->id); |
| | | $server_id = $web_rec["server_id"]; |
| | | } else { |
| | | // Get the first server ID |
| | | $tmp = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = 1 ORDER BY server_name LIMIT 0,1"); |
| | | $server_id = intval($tmp['server_id']); |
| | | } |
| | | $web_config = $app->getconf->get_server_config($app->functions->intval(isset($this->dataRecord["server_id"]) ? $this->dataRecord["server_id"] : $server_id),'web'); |
| | | //* Check for duplicate ssl certs per IP if SNI is disabled |
| | | if(isset($this->dataRecord['ssl']) && $this->dataRecord['ssl'] == 'y' && $web_config['enable_sni'] != 'y') { |
| | | $sql = "SELECT count(domain_id) as number FROM web_domain WHERE `ssl` = 'y' AND ip_address = '".$app->db->quote($this->dataRecord['ip_address'])."' and domain_id != ".$this->id; |
| | |
| | | $app->tform->errorMessage .= $app->tform->lng("error_php_fpm_pm_settings_txt").'<br>'; |
| | | } |
| | | } |
| | | |
| | | // Check rewrite rules |
| | | $server_type = $web_config['server_type']; |
| | | |
| | | if($server_type == 'nginx' && isset($this->dataRecord['rewrite_rules']) && trim($this->dataRecord['rewrite_rules']) != '') { |
| | | $rewrite_rules = trim($this->dataRecord['rewrite_rules']); |
| | | $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 |
| | | $rewrite_rules = str_replace("\r\n", "\n", $rewrite_rules); |
| | | $rewrite_rules = str_replace("\r", "\n", $rewrite_rules); |
| | | $rewrite_rule_lines = explode("\n", $rewrite_rules); |
| | | if(is_array($rewrite_rule_lines) && !empty($rewrite_rule_lines)){ |
| | | foreach($rewrite_rule_lines as $rewrite_rule_line){ |
| | | // rewrite |
| | | if(preg_match('@^\s*rewrite\s+(^/)?\S+(\$)?\s+\S+(\s+(last|break|redirect|permanent|))?\s*;\s*$@', $rewrite_rule_line)) continue; |
| | | // if |
| | | if(preg_match('@^\s*if\s+\(\s*\$\S+(\s+(\!?(=|~|~\*))\s+(\S+|\".+\"))?\s*\)\s*\{\s*$@', $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*$@', $rewrite_rule_line)){ |
| | | $if_level += 1; |
| | | continue; |
| | | } |
| | | // break |
| | | if(preg_match('@^\s*break\s*;\s*$@', $rewrite_rule_line)){ |
| | | $if_level += 1; |
| | | continue; |
| | | } |
| | | // return code [ text ] |
| | | if(preg_match('@^\s*return\s+\d\d\d.*;\s*$@', $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*$@', $rewrite_rule_line)) continue; |
| | | // set |
| | | if(preg_match('@^\s*set\s+\$\S+\s+\S+\s*;\s*$@', $rewrite_rule_line)) continue; |
| | | // closing curly bracket |
| | | if(trim($rewrite_rule_line) == '}'){ |
| | | $if_level -= 1; |
| | | continue; |
| | | } |
| | | $rewrites_are_valid = false; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if(!$rewrites_are_valid || $if_level != 0){ |
| | | $app->tform->errorMessage .= $app->tform->lng("invalid_rewrite_rules_txt").'<br>'; |
| | | } |
| | | } |
| | | |
| | | parent::onSubmit(); |
| | | } |
| | |
| | | } |
| | | </tmpl_if> |
| | | |
| | | <tmpl_loop name="rewrite_rules"> |
| | | <tmpl_var name='rewrite_rule'> |
| | | </tmpl_loop> |
| | | |
| | | <tmpl_loop name="nginx_directives"> |
| | | <tmpl_var name='nginx_directive'> |
| | | </tmpl_loop> |
| | |
| | | // 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 nginx directives |
| | | $final_nginx_directives = array(); |
| | | $nginx_directives = $data['new']['nginx_directives']; |