mirror of
https://github.com/e107inc/e107.git
synced 2025-07-31 20:00:37 +02:00
Fixes #5097 Site redirection not working with www. Moved to method. Test added.
This commit is contained in:
48
class2.php
48
class2.php
@@ -470,54 +470,24 @@ if(!empty($pref['redirectsiteurl']) && !empty($pref['siteurl'])) {
|
|||||||
}
|
}
|
||||||
elseif(deftrue('e_DOMAIN'))
|
elseif(deftrue('e_DOMAIN'))
|
||||||
{
|
{
|
||||||
// Find domain and port from user and from pref
|
$location = e107::getRedirect()->host($_SERVER, $pref['siteurl'], ADMINDIR);
|
||||||
list($urlbase,$urlport) = explode(':',$_SERVER['HTTP_HOST'].':');
|
|
||||||
if(!$urlport)
|
|
||||||
{
|
|
||||||
$urlport = (int) $_SERVER['SERVER_PORT'];
|
|
||||||
}
|
|
||||||
if(!$urlport)
|
|
||||||
{
|
|
||||||
$urlport = 80;
|
|
||||||
}
|
|
||||||
$aPrefURL = explode('/',$pref['siteurl'],4);
|
|
||||||
if (count($aPrefURL) > 2) // we can do this -- there's at least http[s]://dom.ain/whatever
|
|
||||||
{
|
|
||||||
$PrefRoot = $aPrefURL[2];
|
|
||||||
list($PrefSiteBase,$PrefSitePort) = explode(':',$PrefRoot.':');
|
|
||||||
if (!$PrefSitePort)
|
|
||||||
{
|
|
||||||
$PrefSitePort = ( $aPrefURL[0] === 'https:' ) ? 443 : 80; // no port so set port based on 'scheme'
|
|
||||||
}
|
|
||||||
|
|
||||||
// Redirect only if
|
if($location)
|
||||||
// -- ports do not match (http <==> https)
|
{
|
||||||
// -- base domain does not match (case-insensitive)
|
|
||||||
// -- NOT admin area
|
|
||||||
if (($urlport !== $PrefSitePort || stripos($PrefSiteBase, $urlbase) === false) && strpos(e_REQUEST_SELF, ADMINDIR) === false)
|
|
||||||
{
|
|
||||||
$aeSELF = explode('/', e_REQUEST_SELF, 4);
|
|
||||||
$aeSELF[0] = $aPrefURL[0]; // Swap in correct type of query (http, https)
|
|
||||||
$aeSELF[1] = ''; // Defensive code: ensure http:// not http:/<garbage>/
|
|
||||||
$aeSELF[2] = $aPrefURL[2]; // Swap in correct domain and possibly port
|
|
||||||
$location = implode('/',$aeSELF).($_SERVER['QUERY_STRING'] ? '?'.$_SERVER['QUERY_STRING'] : '');
|
|
||||||
$location = filter_var($location, FILTER_SANITIZE_URL);
|
|
||||||
//
|
|
||||||
// header("Location: {$location}", true, 301); // send 301 header, not 302
|
|
||||||
if(defined('e_DEBUG') && e_DEBUG === true)
|
if(defined('e_DEBUG') && e_DEBUG === true)
|
||||||
{
|
{
|
||||||
echo "DEBUG INFO: site-redirect preference enabled.<br />Redirecting to: <a hre='".$location."'>".$location. '</a>';
|
echo "DEBUG INFO: site-redirect preference enabled.<br />Redirecting to: <a href='" . $location . "'>" . $location . "</a>";
|
||||||
echo '<br />e_DOMAIN: ' .e_DOMAIN;
|
echo '<br />e_DOMAIN: ' . e_DOMAIN;
|
||||||
echo '<br />e_SUBDOMAIN: ' .e_SUBDOMAIN;
|
echo '<br />e_SUBDOMAIN: ' . e_SUBDOMAIN;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
e107::getRedirect()->go($location,true,301);
|
e107::getRedirect()->go($location, true, 301); // Issue 301 redirect
|
||||||
}
|
}
|
||||||
|
|
||||||
exit();
|
exit();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -376,6 +376,53 @@ class redirection
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the correct host and generates the redirection URL if needed.
|
||||||
|
*
|
||||||
|
* @param array $server The $_SERVER superglobal containing request data.
|
||||||
|
* @param string $prefUrl The preferred site URL from preferences.
|
||||||
|
* @return string|bool The redirection URL if a redirection is required, or false if no redirection is needed.
|
||||||
|
*/
|
||||||
|
public function host(array $server, string $prefUrl, string $adminDir='')
|
||||||
|
{
|
||||||
|
|
||||||
|
// Extract the current domain and port
|
||||||
|
list($urlbase, $urlport) = explode(':', $server['HTTP_HOST'] . ':');
|
||||||
|
$urlport = $urlport ?: (int) ($server['SERVER_PORT'] ?: 80);
|
||||||
|
|
||||||
|
// Parse the preferred site URL
|
||||||
|
$aPrefURL = parse_url($prefUrl);
|
||||||
|
|
||||||
|
if(empty($aPrefURL['host']))
|
||||||
|
{
|
||||||
|
return false; // Invalid URL structure
|
||||||
|
}
|
||||||
|
|
||||||
|
$PrefRoot = $aPrefURL['host'];
|
||||||
|
list($PrefSiteBase, $PrefSitePort) = explode(':', $PrefRoot . ':');
|
||||||
|
$PrefSitePort = $PrefSitePort ?: (($aPrefURL['scheme'] === 'https') ? 443 : 80);
|
||||||
|
|
||||||
|
$hostMismatch = (strcasecmp($urlbase, $PrefSiteBase) !==0); // -- base domain does not match (case-insensitive)
|
||||||
|
$portMismatch = ($urlport !== $PrefSitePort); // -- ports do not match (http <==> https)
|
||||||
|
|
||||||
|
if(($portMismatch || $hostMismatch) && strpos($server['PHP_SELF'], $adminDir) === false)
|
||||||
|
{
|
||||||
|
// Reconstruct the redirect URL
|
||||||
|
$aeSELF = explode('/', $server['PHP_SELF'], 4);
|
||||||
|
$aeSELF[0] = $aPrefURL['scheme'] . ':'; // Correct scheme (http/https)
|
||||||
|
$aeSELF[1] = ''; // Defensive code: ensure http:// not http:/<garbage>/
|
||||||
|
$aeSELF[2] = $PrefRoot; // Correct domain and port if needed
|
||||||
|
|
||||||
|
$location = implode('/', $aeSELF) . ($server['QUERY_STRING'] ? '?' . $server['QUERY_STRING'] : '');
|
||||||
|
|
||||||
|
return filter_var($location, FILTER_SANITIZE_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return false; // No redirection needed
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Redirect to the given URI
|
* Redirect to the given URI
|
||||||
|
@@ -1,105 +1,207 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
class redirectionTest extends \Codeception\Test\Unit
|
class redirectionTest extends \Codeception\Test\Unit
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var redirection */
|
||||||
|
protected $rd;
|
||||||
|
|
||||||
|
protected function _before()
|
||||||
{
|
{
|
||||||
|
|
||||||
/** @var redirection */
|
try
|
||||||
protected $rd;
|
|
||||||
|
|
||||||
protected function _before()
|
|
||||||
{
|
{
|
||||||
|
$this->rd = $this->make('redirection');
|
||||||
|
}
|
||||||
|
|
||||||
try
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
$this->fail($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public function testRedirect()
|
||||||
{
|
{
|
||||||
$this->rd = $this->make('redirection');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
catch(Exception $e)
|
public function testGetPreviousUrl()
|
||||||
{
|
{
|
||||||
$this->fail($e->getMessage());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public function testGo()
|
||||||
|
{
|
||||||
|
|
||||||
/* public function testRedirect()
|
}
|
||||||
|
|
||||||
|
public function testCheckMaintenance()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetPreviousUrl()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRedirectPrevious()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetSelfExceptions()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetCookie()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCheckMembersOnly()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetCookie()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testClearCookie()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetSelf()
|
||||||
|
{
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
public function testRedirectHost()
|
||||||
|
{
|
||||||
|
|
||||||
|
// List of test cases with various server setups and expected outcomes
|
||||||
|
$testCases = [
|
||||||
|
|
||||||
|
// Case 1: Redirect from HTTP to HTTPS
|
||||||
|
|
||||||
|
/* 1 => [
|
||||||
|
'server' => [
|
||||||
|
'HTTP_HOST' => 'example.com',
|
||||||
|
'SERVER_PORT' => 80,
|
||||||
|
'PHP_SELF' => '/index.php',
|
||||||
|
'QUERY_STRING' => 'foo=bar'
|
||||||
|
],
|
||||||
|
'prefUrl' => 'https://example.com',
|
||||||
|
'adminDir' => '/e107_admin', // Simulating admin area constant
|
||||||
|
'expected' => 'https://example.com/index.php?foo=bar'
|
||||||
|
],*/
|
||||||
|
|
||||||
|
// Case 2: Redirect due to port mismatch (non-standard port)
|
||||||
|
|
||||||
|
2 => [
|
||||||
|
'server' => [
|
||||||
|
'HTTP_HOST' => 'example.com',
|
||||||
|
'SERVER_PORT' => 80,
|
||||||
|
'PHP_SELF' => '',
|
||||||
|
'QUERY_STRING' => ''
|
||||||
|
],
|
||||||
|
'prefUrl' => 'https://example.com/',
|
||||||
|
'adminDir' => '/e107_admin', // Simulating admin area constant
|
||||||
|
'expected' => 'https://example.com'
|
||||||
|
],
|
||||||
|
|
||||||
|
// Case 3: Remove "www." subdomain
|
||||||
|
3 => [
|
||||||
|
'server' => [
|
||||||
|
'HTTP_HOST' => 'www.example.com',
|
||||||
|
'SERVER_PORT' => 443,
|
||||||
|
'PHP_SELF' => '/',
|
||||||
|
'QUERY_STRING' => ''
|
||||||
|
],
|
||||||
|
'prefUrl' => 'https://example.com',
|
||||||
|
'adminDir' => '/e107_admin', // Simulating admin area constant
|
||||||
|
'expected' => 'https://example.com'
|
||||||
|
],
|
||||||
|
|
||||||
|
// Case 4: Add "www." subdomain
|
||||||
|
|
||||||
|
4 => [
|
||||||
|
'server' => [
|
||||||
|
'HTTP_HOST' => 'example.com',
|
||||||
|
'SERVER_PORT' => 443,
|
||||||
|
'PHP_SELF' => '',
|
||||||
|
'QUERY_STRING' => ''
|
||||||
|
],
|
||||||
|
'prefUrl' => 'https://www.example.com',
|
||||||
|
'adminDir' => '/e107_admin', // Simulating admin area constant
|
||||||
|
'expected' => 'https://www.example.com'
|
||||||
|
],
|
||||||
|
|
||||||
|
// Case 5: No redirect needed (everything matches)
|
||||||
|
5 => [
|
||||||
|
'server' => [
|
||||||
|
'HTTP_HOST' => 'example.com',
|
||||||
|
'SERVER_PORT' => 443,
|
||||||
|
'PHP_SELF' => '/home',
|
||||||
|
'QUERY_STRING' => ''
|
||||||
|
],
|
||||||
|
'prefUrl' => 'https://example.com',
|
||||||
|
'adminDir' => '/e107_admin', // Simulating admin area constant
|
||||||
|
'expected' => false // No redirect
|
||||||
|
],
|
||||||
|
|
||||||
|
// Case 6: No redirect in admin area
|
||||||
|
6 => [
|
||||||
|
'server' => [
|
||||||
|
'HTTP_HOST' => 'example.com',
|
||||||
|
'SERVER_PORT' => 443,
|
||||||
|
'PHP_SELF' => '/e107_admin/dashboard',
|
||||||
|
'QUERY_STRING' => ''
|
||||||
|
],
|
||||||
|
'prefUrl' => 'https://example.com',
|
||||||
|
'adminDir' => '/e107_admin', // Simulating admin area constant
|
||||||
|
'expected' => false // No redirect because it's an admin area
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach($testCases as $index => $testCase)
|
||||||
{
|
{
|
||||||
|
$redirectUrl = $this->rd->host($testCase['server'], $testCase['prefUrl'], $testCase['adminDir']);
|
||||||
|
|
||||||
|
self::assertSame(
|
||||||
|
$testCase['expected'],
|
||||||
|
$redirectUrl,
|
||||||
|
"Failed test case #{$index}. Expected: " . var_export($testCase['expected'], true) . " but got: " . var_export($redirectUrl, true)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetPreviousUrl()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGo()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCheckMaintenance()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetPreviousUrl()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRedirectPrevious()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetSelfExceptions()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetCookie()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCheckMembersOnly()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetCookie()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testClearCookie()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetSelf()
|
|
||||||
{
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
public function testRedirectStaticDomain()
|
|
||||||
{
|
|
||||||
$result = $this->rd->redirectStaticDomain();
|
|
||||||
$this->assertEmpty($result);
|
|
||||||
|
|
||||||
$this->rd->domain = 'static1.e107.org';
|
|
||||||
$this->rd->staticDomains = ['https://static1.e107.org', 'https://static2.e107.org'];
|
|
||||||
|
|
||||||
$this->rd->self = 'https://static1.e107.org/blogs';
|
|
||||||
$this->rd->siteurl = 'https://e107.org/';
|
|
||||||
|
|
||||||
$result = $this->rd->redirectStaticDomain();
|
|
||||||
|
|
||||||
$this->assertSame("https://e107.org/blogs", $result);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testRedirectStaticDomain()
|
||||||
|
{
|
||||||
|
|
||||||
|
$result = $this->rd->redirectStaticDomain();
|
||||||
|
$this->assertEmpty($result);
|
||||||
|
|
||||||
|
$this->rd->domain = 'static1.e107.org';
|
||||||
|
$this->rd->staticDomains = ['https://static1.e107.org', 'https://static2.e107.org'];
|
||||||
|
|
||||||
|
$this->rd->self = 'https://static1.e107.org/blogs';
|
||||||
|
$this->rd->siteurl = 'https://e107.org/';
|
||||||
|
|
||||||
|
$result = $this->rd->redirectStaticDomain();
|
||||||
|
|
||||||
|
$this->assertSame("https://e107.org/blogs", $result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user