当直接访问index.php?* = *时,.htaccess或php重定向到友好的URL

时间:2013-02-24 23:45:16

标签: php facebook redirect

我正在为我的游戏网站开发一个新设计,我所做的是做了一个重写规则:

RewriteRule ^play/([^/\.]+)/?$ index.php?play=$1 [L]

当用户打开/播放/游戏名称停留在地址栏(规范网址)并使用我的index.php加载游戏页面时,这非常有效。

但是,我现在要做的是,当用户访问旧网址(index.php?play=gamename)时,他们应该被重定向到新的规范网址(/play/gamename)。

有人可以为我输入代码来执行此操作吗?我愿意使用.htaccess文件或index.php文件执行此操作,无论哪种方式最佳。

另一个问题是我已经有很多Facebook评论和喜欢,它们引用了index.php?play=gamename页面,是否有可能以某种方式将这些喜欢和评论移到新的更漂亮的网址上?

2 个答案:

答案 0 :(得分:0)

我认为您会寻找类似这样的内容,将旧网址重定向到新网址,同时将该网址保留为脚本提供的实际位置。

Options +FollowSymlinks
RewriteEngine On

RewriteBase /

# Stop rewrite from doing an infinite loop by rejecting redirects
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteCond %{REQUEST_URI}  ^/index\.php$
RewriteCond %{QUERY_STRING} ^play=(.*)$
RewriteRule .* /play/%1? [NC,R=301,L]

# Rewrite all requests from /play/ to index.php
RewriteRule ^play/(.*)$ /index.php?play=$1 [NC,L]

至于Facebook,您无法对旧评论做任何事情,但是您的重写将会照顾到以后对您网站的任何点击。

答案 1 :(得分:0)

在php中执行此操作的方法如下:

此功能检查是否正在直接查看该页面。

function directviewcheck(){
    $requestingurl = $_SERVER['REQUEST_URI'];
    $phpself = $_SERVER['PHP_SELF'];
    $phpselflength = strlen($phpself);
    $resulturlcrop = mb_substr($requestingurl, 0, $phpselflength);

    if( $resulturlcrop == $phpself ){
        return true;
    }else{
        return false;
    }
}

这将告诉您浏览器中的URL是否与文件名匹配。如果确实如此,它将返回true。

接下来在index.php中调用它:

if( directviewcheck() == true ){
    // your redirect code
    // Something like this should work

    $gamename = $_GET['play'];
    header("HTTP/1.1 301 Moved Permanently")
    header("Location: http://www.yoursite.com/play/" . $gamename );
    exit;  // make sure you use exit or its alias die to prevent the page from showing.

}

旧的链接将转到新页面,仍旧到旧链接上的内容的搜索引擎会知道删除它们并为新链接编制索引。

如果你需要它更具动态性,你可以创建一个位置变量,然后根据用途将它放在header()中。

无论如何,你的问题很老,但对你或其他人来说可能仍然有用。

====

在.htaccess中,sjdaws看起来很有效。

====

就像你的Facebook我看到的那样: Facebook like count resets after a 301 redirection 要么 How to manage 'Like' button for URLs that can change slightly?