PHP 301重定向到定义的URL

时间:2015-02-09 10:24:45

标签: php

我正在尝试根据定义的网址重定向用户。

如果定义的网址包含www且请求网址 不包含www,则会将用户重定向到网址的www版本。< / p>

如果定义的网址不包含www且请求网址 包含www,则该用户将重定向到非www版本的网址。

还需要考虑子域和路径。

我尝试了以下内容:

define(URL, 'localhost.com/cms');

$request = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];

if (get_subdomain(URL) != get_subdomain($request)) { 
    header("HTTP/1.1 301 Moved Permanently", true, 301);
    header('Location:' . URL . $_SERVER['REQUEST_URI']);
}

function get_subdomain($url){
    $sub = parse_url($url);
    return $sub['host'];
}

1 个答案:

答案 0 :(得分:0)

在您的示例代码中,您在尝试调用它之后定义了一个函数。您需要将函数调用置于if语句之上:

function get_subdomain($url){
    $sub = parse_url($url);
    return $sub['host'];
}

if (get_subdomain(URL) != get_subdomain($request)) { 
    header("HTTP/1.1 301 Moved Permanently", true, 301);
    header('Location:' . URL . $_SERVER['REQUEST_URI']);
}

define函数需要一个字符串作为其第一个参数。您还错过了网址中的http://

下面将比较路径(例如/cms)以查看用户是否请求了正确的页面(否则它们将不断重定向),然后比较主机。主机将包含www.或其他子域位。

为了便于阅读,我制作了if多行。

define('URL', 'http://localhost.com/cms');

$request = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"];

$urlParts = parse_url(URL);
$requestParts = parse_url($request);

if( $urlParts['path'] == $requestParts['path'] // Are we looking at the same pages
    &&
    $urlParts['host'] !== $requestParts['host'] // Check domain. Will also include sub-domain
) {
  // Failed check. Redirect to URL
  header("HTTP/1.1 301 Moved Permanently", true, 301);
  header('Location:' . URL);
}

备用解决方案是在.htaccess文件中执行上述操作:

# If url begins with www, and we are on the right page, redirect to the non-www version
RewriteCond %{HTTP_HOST} ^www.localhost\.com
RewriteRule ^cms% http://localhost.com/cms [R=301,L]