dylanjameswagner
6/14/2019 - 2:19 PM

PHP Redirects to emulate .htaccess redirects on nginx

PHP Redirects to emulate .htaccess redirects on nginx

<?php

// include this file in your root index.php before any Wordpress files start getting pulled in.

// allow us to force garbage collection (for performance)
// commented out for now because it should be enabled by default. Going to test without it first.
// gc_enable(); // PHP >= 5.3.0

// old_path => new_path
// make sure all of your old_paths have no trailing slash
$rewrite_paths = array(
  "/old/path-1" => "/new-path1/",
  "/another-old-path" => "/new-paths-are-better",
  "/this/is/an/example/of-an-old-path" => "/our/new/path"
);

/**
 * The code below should not need to be altered. You should only modify the array above.
 *
 * The code below does the following:
 *
 * 1. Remove any GET parameters from the requested URI (makes matching more consistent, but needs to be removed in case you need to match old queries).
 * 2. Check for a trailing slash on the requested URI and remove it if found.
 * 3. Check for the base of the requested URI (minus GET params and trailing slash) and look for that key in the array above.
 * 4. If the requested URI is found as a key, 301 Redirect to the respective value (new URL)
 */

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$base_uri = $uri_parts[0];

// In case you need to match query parameters in the original URLs, comment out the two lines above and uncomment the line below:
// $base_uri = $_SERVER['REQUEST_URI'];

if(substr($base_uri, -1) == '/') {
  // trim trailing slash
  $base_uri = substr($base_uri, 0, -1);
}

if (array_key_exists($base_uri, $rewrite_paths)) {
  header('HTTP/1.0 301 Moved Permanently');
  header('Location: '.$rewrite_paths[$base_uri]);
  exit();
} else {
  // no match so free the array from mem and force a garbage collect
  unset($rewrite_paths);
  gc_collect_cycles(); // PHP >= 5.3.0
}

?>