Файл: apwa/phpbb_seo/includes/setup_phpbb_seo.php
Строк: 226
<?php
/**
*
* @package Ultimate SEO URL phpBB SEO
* @version $Id: setup_phpbb_seo.php 327 2011-09-07 07:24:49Z dcz $
* @copyright (c) 2006 - 2010 www.phpbb-seo.com
* @license http://www.opensource.org/licenses/rpl1.5.txt Reciprocal Public License 1.5
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB')) {
exit;
}
/**
* setup_phpbb_seo Class
* www.phpBB-SEO.com
* @package Ultimate SEO URL phpBB SEO
*/
class setup_phpbb_seo {
/**
* Do the init
*/
function init_phpbb_seo() {
global $phpEx, $config, $phpbb_root_path;
// --> Zero Dupe
$this->seo_opt['zero_dupe'] = array( 'on' => false, // Activate or not the redirections : true / false
'strict' => false, // strict compare, == VS strpos() : true / false
'post_redir' => 'guest', // Redirect post urls if not valid ? : guest / all / post / off
);
$this->cache_config['dynamic_options']['zero_dupe'] = $this->seo_opt['zero_dupe']; // Do not change
$this->seo_opt['zero_dupe']['do_redir'] = false; // do not change
$this->seo_opt['zero_dupe']['go_redir'] = true; // do not change
$this->seo_opt['zero_dupe']['do_redir_post'] = false; // do not change
$this->seo_opt['zero_dupe']['start'] = 0; // do not change
$this->seo_opt['zero_dupe']['redir_def'] = array(); // do not change
// <-- Zero Dupe
// Let's load config and forum urls, mods adding options in the cache file must do it before
if ($this->check_cache()) {
foreach($this->cache_config['dynamic_options'] as $optionname => $optionvalue ) {
if (@is_array($this->cache_config['settings'][$optionname])) {
$this->seo_opt[$optionname] = array_merge($this->seo_opt[$optionname], $this->cache_config['settings'][$optionname]);
} elseif ( @isset($this->cache_config['settings'][$optionvalue]) ) {
$this->seo_opt[$optionvalue] = $this->cache_config['settings'][$optionvalue];
}
}
$this->modrtype = @isset($this->seo_opt['modrtype']) ? $this->seo_opt['modrtype'] : $this->modrtype;
if ( $this->modrtype > 1 ) { // Load cached URLs
$this->seo_url['forum'] =& $this->cache_config['forum'];
}
}
// ====> here starts the add-on and custom set up <====
// ===> Custom url replacements <===
// Here you can set up custom replacements to be used in title injection.
// Example : array( 'find' => 'replace')
// $this->url_replace = array(
// // Purely cosmetic replace
// '$' => 'dollar', '€' => 'euro',
// ''s' => 's', // it's => its / mary's => marys ...
// // Language specific replace (German example)
// 'ß' => 'ss',
// 'Ä' => 'Ae', 'ä' => 'ae',
// 'Ö' => 'Oe', 'ö' => 'oe',
// 'Ü' => 'Ue', 'ü' => 'ue',
// );
// ===> Custom values Delimiters, Static parts and Suffixes <===
// ==> Delimiters <==
// Can be overridden, requires .htaccess update <=
// Example :
// $this->seo_delim['forum'] = '-mydelim'; // instead of the default "-f"
// ==> Static parts <==
// Can be overridden, requires .htaccess update.
// Example :
// $this->seo_static['post'] = 'message'; // instead of the default "post"
// !! phpBB files must be treated a bit differently !!
// Example :
// $this->seo_static['file'][ATTACHMENT_CATEGORY_QUICKTIME] = 'quicktime'; // instead of the default "qt"
// $this->seo_static['file_index'] = 'my_files_virtual_dir'; // instead of the default "resources"
// ==> Suffixes <==
// Can be overridden, requires .htaccess update <=
// Example :
// $this->seo_ext['topic'] = '/'; // instead of the default ".html"
// ==> Forum redirect <==
// In case you are using forum id removing and need to edit some forum urls
// that where already indexed, you can keep track of them ritgh here
// NOTE :
// This will only allow the zero duplicate to perform the appropriate redirection
// You need the mod for this to work :
// http://www.phpbb-seo.com/en/zero-duplicate/phpbb-seo-zero-duplicate-t1220.html (en)
// http://www.phpbb-seo.com/fr/zero-duplicate/zero-duplicate-phpbb-seo-t1502.html (fr)
//
// Example :
//
// $this->forum_redirect = array(
// // 'old-url-without-id-nor-suffix' => forum_id,
// 'old-forum-url' => 23,
// 'another-one' => 32,
// 'anoter-version-of-the-same' => 32,
// );
//
// ==> Special for lazy French, others may delete this part
if ( strpos($config['default_lang'], 'fr') !== false ) {
$this->seo_static['user'] = 'membre';
$this->seo_static['group'] = 'groupe';
$this->seo_static['global_announce'] = 'annonces';
$this->seo_static['leaders'] = 'equipe';
$this->seo_static['atopic'] = 'sujets-actifs';
$this->seo_static['utopic'] = 'sans-reponses';
$this->seo_static['npost'] = 'nouveaux-messages';
$this->seo_static['urpost'] = 'non-lu';
$this->seo_static['file_index'] = 'ressources';
}
// <== Special for lazy French, others may delete this part
$this->seo_static['index'] = 'forum';
// Let's make sure that settings are consistent
$this->check_config();
}
// Here start the add-on methods
// --> Zero Duplicate
/**
* Custom HTTP 301 redirections.
* To kill duplicates
*/
function seo_redirect($url, $header = '301 Moved Permanently', $code = 301, $replace = true) {
global $db;
if (!$this->seo_opt['zero_dupe']['on'] || @headers_sent()) {
return false;
}
garbage_collection();
$url = str_replace('&', '&', $url);
// Behave as redirect() for checks to provide with the same level of protection
// Make sure no linebreaks are there... to prevent http response splitting for PHP < 4.4.2
if (strpos(urldecode($url), "n") !== false || strpos(urldecode($url), "r") !== false || strpos($url, ';') !== false) {
trigger_error('Tried to redirect to potentially insecure url.', E_USER_ERROR);
}
// Now, also check the protocol and for a valid url the last time...
$allowed_protocols = array('http', 'https'/*, 'ftp', 'ftps'*/);
$url_parts = parse_url($url);
if ($url_parts === false || empty($url_parts['scheme']) || !in_array($url_parts['scheme'], $allowed_protocols)) {
trigger_error('Tried to redirect to potentially insecure url.', E_USER_ERROR);
}
$http = 'HTTP/1.1 ';
header($http . $header, $replace, $code);
header('Location: ' . $url);
exit_handler();
}
/**
* Set the do_redir_post option right
*/
function set_do_redir_post() {
global $user;
switch ($this->seo_opt['zero_dupe']['post_redir']) {
case 'guest':
if ( empty($user->data['is_registered']) ) {
$this->seo_opt['zero_dupe']['do_redir_post'] = true;
}
break;
case 'all':
$this->seo_opt['zero_dupe']['do_redir_post'] = true;
break;
case 'off': // Do not redirect
$this->seo_opt['zero_dupe']['do_redir'] = false;
$this->seo_opt['zero_dupe']['go_redir'] = false;
$this->seo_opt['zero_dupe']['do_redir_post'] = false;
break;
default:
$this->seo_opt['zero_dupe']['do_redir_post'] = false;
break;
}
return $this->seo_opt['zero_dupe']['do_redir_post'];
}
/**
* Redirects if the uri sent does not match (fully) the
* attended url
*/
function seo_chk_dupe($url = '', $uri = '', $path = '') {
global $auth, $user, $_SID, $phpbb_root_path, $config;
if (empty($this->seo_opt['req_file']) || (!$this->seo_opt['rewrite_usermsg'] && $this->seo_opt['req_file'] == 'search') ) {
return false;
}
if (!empty($_REQUEST['explain']) && (boolean) ($auth->acl_get('a_') && defined('DEBUG_EXTRA'))) {
if ($_REQUEST['explain'] == 1) {
return true;
}
}
$path = empty($path) ? $phpbb_root_path : $path;
$uri = !empty($uri) ? $uri : $this->seo_path['uri'];
$reg = !empty($user->data['is_registered']) ? true : false;
$url = empty($url) ? $this->expected_url($path) : str_replace('&', '&', append_sid($url, false, true, 0));
$url = $this->drop_sid($url);
// Only add sid if user is registered and needs it to keep session
if (!empty($_GET['sid']) && !empty($_SID) && ($reg || !$this->seo_opt['rem_sid']) ) {
if ($_GET['sid'] == $user->session_id) {
$url .= (utf8_strpos( $url, '?' ) !== false ? '&' : '?') . 'sid=' . $user->session_id;
}
}
$url = str_replace( '%26', '&', urldecode($url));
if ($this->seo_opt['zero_dupe']['do_redir']) {
$this->seo_redirect($url);
} else {
$url_check = $url;
// we remove url hash for comparison, but keep it for redirect
if (strpos($url, '#') !== false) {
list($url_check, $hash) = explode('#', $url, 2);
}
if ($this->seo_opt['zero_dupe']['strict']) {
return $this->seo_opt['zero_dupe']['go_redir'] && ( ($uri != $url_check) ? $this->seo_redirect($url) : false );
} else {
return $this->seo_opt['zero_dupe']['go_redir'] && ( (utf8_strpos( $uri, $url_check ) === false) ? $this->seo_redirect($url) : false );
}
}
}
/**
* expected_url($path = '')
* build expected url
*/
function expected_url($path = '') {
global $phpbb_root_path, $phpEx;
$path = empty($path) ? $phpbb_root_path : $path;
$params = array();
foreach ($this->seo_opt['zero_dupe']['redir_def'] as $get => $def) {
if ((isset($_GET[$get]) && $def['keep']) || !empty($def['force'])) {
$params[$get] = $def['val'];
if (!empty($def['hash'])) {
$params['#'] = $def['hash'];
}
}
}
$this->page_url = append_sid($path . $this->seo_opt['req_file'] . ".$phpEx", $params, false, 0);
return $this->page_url;
}
/**
* set_cond($bool, $type = 'bool_redir', $or = true)
* Helps out grabbing boolean vars
*/
function set_cond($bool, $type = 'do_redir', $or = true) {
if ( $or ) {
$this->seo_opt['zero_dupe'][$type] = (boolean) ($bool || $this->seo_opt['zero_dupe'][$type]);
} else {
$this->seo_opt['zero_dupe'][$type] = (boolean) ($bool && $this->seo_opt['zero_dupe'][$type]);
}
return;
}
/**
* check start var consistency
* Returns our best guess for $start, eg the first valid page
*/
function seo_chk_start($start = 0, $limit = 0) {
if ($limit > 0) {
$start = is_int($start/$limit) ? $start : intval($start/$limit)*$limit;
}
if ( $start >= 1 ) {
$this->start = $this->seo_delim['start'] . (int) $start;
return (int) $start;
}
$this->start = '';
return 0;
}
/**
* get_canonical
* Returns the canonical url if ever built
* Beware with ssl :
* Since we want zero duplicate, the canonical element will only use https when ssl is forced
* (eg set as THE server protocol in config) and will use http in other cases.
*/
function get_canonical() {
return $this->sslify($this->seo_path['canonical'], $this->ssl['forced'], true);
}
// <-- Zero Duplicate
}
?>