Last active
March 3, 2017 10:24
-
-
Save m-engel/10458301 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//<?php | |
/** | |
* SEO Strict URLs | |
* | |
* Enforces the use of strict URLs to prevent duplicate content. | |
* | |
* @category plugin | |
* @version 1.0.1P2 | |
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL) | |
* @author Jeremy Luebke, Phize | |
* @internal @properties &editDocLinks=Edit document links;int;1 &makeFolders=Rewrite containers as folders;int;1 &emptyFolders=Check for empty container when rewriting;int;1 &override=Enable manual overrides;int;0 &overrideTV=Override TV name;string;seoOverride; | |
* @internal @events OnWebPageInit,OnWebPagePrerender | |
* @internal @modx_category Manager and Admin | |
*/ | |
// Strict URLs | |
// version 1.0.1 | |
// Enforces the use of strict URLs to prevent duplicate content. | |
// By Jeremy Luebke @ www.xuru.com | |
// Contributions by Brian Stanback @ www.stanback.net | |
// On Install: Check the "OnWebPageInit" & "OnWebPagePrerender" boxes in the System Events tab. | |
// Plugin configuration: &editDocLinks=Edit document links;int;1 &makeFolders=Rewrite containers as folders;int;1 &emptyFolders=Check for empty container when rewriting;int;0 &override=Enable manual overrides;int;0 &overrideTV=Override TV name;string;seoOverride | |
// For overriding documents, create a new template variabe (TV) named seoOverride with the following options: | |
// Input Type: DropDown List Menu | |
// Input Option Values: Disabled==-1||Base Name==0||Append Extension==1||Folder==2 | |
// Default Value: -1 | |
// # Include the following in your .htaccess file | |
// # Replace "example.com" & "example\.com" with your domain info | |
// RewriteCond %{HTTP_HOST} . | |
// RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] | |
// RewriteRule (.*) http://www.example.com/$1 [R=301,L] | |
// Some codes are added/modified by Phize(http://phize.net) | |
// Begin plugin code | |
$e = &$modx->event; | |
if ($e->name == 'OnWebPageInit') | |
{ | |
$documentIdentifier = $modx->documentIdentifier; | |
if ($documentIdentifier) // Check for 404 error | |
{ | |
$myProtocol = ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; | |
$s = $_SERVER['REQUEST_URI']; | |
$parts = explode("?", $s); | |
// Added by Phize | |
preg_match('#^.+?(?<!\?)&(.*?)(?:\?.*)?$#', $s, $matches); | |
$parameters = $matches[1]; | |
// | |
$alias = $modx->aliasListing[$documentIdentifier]['alias']; | |
if ($makeFolders) | |
{ | |
if ($emptyFolders) | |
{ | |
$result = $modx->db->select('isfolder', $modx->getFullTableName('site_content'), 'id = ' . $documentIdentifier); | |
$isfolder = $modx->db->getValue($result); | |
} | |
else | |
{ | |
$isfolder = (count($modx->getChildIds($documentIdentifier, 1)) > 0) ? 1 : 0; | |
} | |
} | |
if ($override && $overrideOption = $modx->getTemplateVarOutput($overrideTV, $documentIdentifier)) | |
{ | |
switch ($overrideOption[$overrideTV]) | |
{ | |
case 0: | |
$isoverride = 1; | |
break; | |
case 1: | |
$isfolder = 0; | |
break; | |
case 2: | |
$makeFolders = 1; | |
$isfolder = 1; | |
} | |
} | |
if ($isoverride) | |
{ | |
$strictURL = preg_replace('/[^\/]+$/', $alias, $modx->makeUrl($documentIdentifier)); | |
} | |
elseif ($isfolder && $makeFolders) | |
{ | |
$strictURL = preg_replace('/[^\/]+$/', $alias, $modx->makeUrl($documentIdentifier)) . "/"; | |
} | |
else | |
{ | |
$strictURL = $modx->makeUrl($documentIdentifier); | |
} | |
// Added by Phize | |
//if ($parameters) { | |
// $strictURL .= '&' . $parameters; | |
//} | |
$myDomain = $myProtocol . "://" . $_SERVER['HTTP_HOST']; | |
$newURL = $myDomain . $strictURL; | |
$requestedURL = $myDomain . $parts[0]; | |
if ($documentIdentifier == $modx->config['site_start']) | |
{ | |
if ($requestedURL != $modx->config['site_url']) | |
{ | |
// Force redirect of site start | |
header("HTTP/1.1 301 Moved Permanently"); | |
$qstring = preg_replace("#(^|&)(q|id)=[^&]+#", '', $parts[1]); // Strip conflicting id/q from query string | |
// Modified by Phize | |
if ($qstring && $parameters) | |
{ | |
header('Location: ' . $modx->config['site_url'] . '?' . $qstring . '&' . $parameters); | |
} | |
else if ($qstring) | |
{ | |
header('Location: ' . $modx->config['site_url'] . '?' . $qstring); | |
} | |
else if ($parameters) | |
{ | |
header('Location: ' . $modx->config['site_url'] . '?' . $parameters); | |
} | |
else | |
{ | |
header('Location: ' . $modx->config['site_url']); | |
} | |
// | |
// if ($qstring) header('Location: ' . $modx->config['site_url'] . '?' . $qstring); | |
// else header('Location: ' . $modx->config['site_url']); | |
exit(0); | |
} | |
} | |
elseif ($parts[0] != $strictURL) | |
{ | |
// Force page redirect | |
header("HTTP/1.1 301 Moved Permanently"); | |
$qstring = preg_replace("#(^|&)(q|id)=[^&]+#", '', $parts[1]); // Strip conflicting id/q from query string | |
// Modified by Phize | |
if ($qstring && $parameters) | |
{ | |
header('Location: ' . $strictURL . '?' . $qstring . '&' . $parameters); | |
} | |
else if ($qstring) | |
{ | |
header('Location: ' . $strictURL . '?' . $qstring); | |
} | |
else if ($parameters) | |
{ | |
header('Location: ' . $strictURL . '?' . $parameters); | |
} | |
else | |
{ | |
header('Location: ' . $strictURL); | |
} | |
// | |
// if ($qstring) header('Location: ' . $strictURL . '?' . $qstring); | |
// else header('Location: ' . $strictURL); | |
exit(0); | |
} | |
} | |
} | |
elseif ($e->name == 'OnWebPagePrerender') | |
{ | |
if ($editDocLinks) | |
{ | |
$myDomain = $_SERVER['HTTP_HOST']; | |
$furlSuffix = $modx->config['friendly_url_suffix']; | |
$baseUrl = $modx->config['base_url']; | |
$o = &$modx->documentOutput; // get a reference of the output | |
// Reduce site start to base url | |
$overrideAlias = $modx->aliasListing[$modx->config['site_start']]['alias']; | |
$overridePath = $modx->aliasListing[$modx->config['site_start']]['path']; | |
// Modified by Phize | |
$o = preg_replace("#((href|action)=\"|$myDomain)($baseUrl)?($overridePath/)?$overrideAlias$furlSuffix([^\w-\.!~\*\(\)])#", '${1}' . $baseUrl . '${5}', $o); | |
// $o = preg_replace("#((href|action)=\"|$myDomain)($baseUrl)?($overridePath/)?$overrideAlias$furlSuffix#", '${1}' . $baseUrl, $o); | |
if ($override) | |
{ | |
// Replace manual override links | |
$sql = "SELECT tvc.contentid as id, tvc.value as value FROM " . $modx->getFullTableName('site_tmplvars') . " tv "; | |
$sql .= "INNER JOIN " . $modx->getFullTableName('site_tmplvar_templates') . " tvtpl ON tvtpl.tmplvarid = tv.id "; | |
$sql .= "LEFT JOIN " . $modx->getFullTableName('site_tmplvar_contentvalues') . " tvc ON tvc.tmplvarid = tv.id "; | |
$sql .= "LEFT JOIN " . $modx->getFullTableName('site_content') . " sc ON sc.id = tvc.contentid "; | |
$sql .= "WHERE sc.published = 1 AND tvtpl.templateid = sc.template AND tv.name = '$overrideTV'"; | |
$results = $modx->dbQuery($sql); | |
while ($row = $modx->fetchRow($results)) | |
{ | |
$overrideAlias = $modx->aliasListing[$row['id']]['alias']; | |
$overridePath = $modx->aliasListing[$row['id']]['path']; | |
switch ($row['value']) | |
{ | |
case 0: | |
// Modified by Phize | |
$o = preg_replace("#((href|action)=[\"']($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix([^\w-\.!~\*\(\)])#", '${1}' . $overrideAlias . '${5}', $o); | |
// $o = preg_replace("#((href|action)=\"($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix#", '${1}' . $overrideAlias, $o); | |
break; | |
case 2: | |
// Modified by Phize | |
$o = preg_replace("#((href|action)=[\"']($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix(/|([^\w-\.!~\*\(\)]))#", '${1}' . rtrim($overrideAlias, '/') . '/' . '${6}', $o); | |
// $o = preg_replace("#((href|action)=\"($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix/?#", '${1}' . rtrim($overrideAlias, '/') . '/', $o); | |
break; | |
} | |
} | |
} | |
if ($makeFolders) | |
{ | |
if ($emptyFolders) | |
{ | |
// Populate isfolder array | |
$isfolder_arr = array(); | |
$result = $modx->db->select('id', $modx->getFullTableName('site_content'), 'published > 0 AND isfolder > 0'); | |
while ($row = $modx->db->getRow($result)) | |
$isfolder_arr[$row['id']] = true; | |
} | |
// Replace container links | |
foreach ($modx->documentListing as $id) | |
{ | |
if ((is_array($isfolder_arr) && isset($isfolder_arr[$id])) || count($modx->getChildIds($id, 1))) | |
{ | |
$overrideAlias = $modx->aliasListing[$id]['alias']; | |
$overridePath = $modx->aliasListing[$id]['path']; | |
// Modified by Phize | |
$o = preg_replace("#((href|action)=[\"']($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix(/|([^\w-\.!~\*\(\)]))#", '${1}' . rtrim($overrideAlias, '/') . '/' . '${6}', $o); | |
// $o = preg_replace("#((href|action)=\"($baseUrl)?($overridePath/)?|$myDomain$baseUrl$overridePath/?)$overrideAlias$furlSuffix/?#", '${1}' . rtrim($overrideAlias, '/') . '/', $o); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment