Skip to content

Instantly share code, notes, and snippets.

@m-engel
Last active March 3, 2017 10:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save m-engel/10458301 to your computer and use it in GitHub Desktop.
Save m-engel/10458301 to your computer and use it in GitHub Desktop.
//<?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