我正在尝试根据定义的网址重定向用户。
如果定义的网址包含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'];
}
答案 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]