本节内容:
php实现全站的所有内页的301转向
一,什么是301转向
301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
其它常见的状态码还包括,200表示一切正常,404网页找不到,302暂时转向等。
二,网站做转向的方法
网址转向方法主要包括:301转向,302转向,JavaScript转向,PHP/ASP/CGI转向,META REFRESH网页META刷新,等。302转向可能会有URL规范化问题。其它方法都是常用的作弊手法,当然不是说不可以正当地用,方法本身没有错,但被作弊者用多了,搜索引擎对这些可疑的转向都很敏感。何必冒险呢。
三,301转向的必要性
当网页A用301重定向转到网页B时,搜索引擎可以肯定网页A永久的改变位置,或者说实际上不存在了,搜索引擎就会把网页B当作唯一有效目标。好处是,
第一,没有网址规范化问题
第二,也很重要的,网页A的PR网页级别会传到网页B
第三,收录不会因为域名更换没有.
下面来看一个php 301重定向的例子,如下:
$url="http://www.".$_SERVER["REQUEST_URI"];
header("HTTP/1.1 301 Moved Permanently");
header ("Location:$url");
?>
以Discuz6.0为例子
index.php
archiver/index.php
forumdisplay.php
viewthread.php
space.php
tag.php
blog.php
找到原来的老的域名中的上列文件,加入上面的代码,然后更新即可。
使用curl测试下:
HTTP/1.0 301 Moved Permanently
Date: Tue, 06 May 2008 06:27:39 GMT
Server: apache
Location: http://www./sssss.php
如见到上面的HTTP/1.0 301 Moved Permanently时,就表示可以了.下次只要点相关的链接,会自动转向新的链接,搜索引擎也会自动更新成新的链接。
301重定向实现方法,及对网站优化的作用
301重定向(也叫301转向,301跳转)对网站优化所起的作用是不可忽视的,尤其是针对SE(搜索引擎)处理网站页面权重的时候,更加显得重要。网站换了新域名,默认首页需要跳转等,从SEO角度来说,我们都建议使用301重定向,而不是JS跳转或META REFRESH或302转向,这些很容易引来SE的惩罚。
什么是301重定向呢?
301重定向是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。其它常见的状态码还包括,200表示一切正常,404网页找不到,302暂时转向,等等。
为什么要用301转向?
网址转向方法主要包括:301转向,302转向,JavaScript转向,PHP/ASP/CGI转向,META REFRESH网页META刷新等。302转向可能会有URL规范化问题。其它方法都是常用的作弊手法,当然不是说不可以正当地用,方法本身没有错,但被作弊者用多了,搜索引擎对这些可疑的转向都很敏感。何必冒险呢。
关于301转向和网址规范化问题,大家可以去阅读下ZAC写的文章。本文,仅仅讨论在ASP环境下,如何设置301重定向问题;其他语言亦可参考。
网站的首页一般有以下几种:
http://
http://www.
http:///index.asp
http://www./index.asp
……
很自然的,以上的这些网址形式都指向到了一个网站,如果在搜索引擎中都启用这些形式,那么,网页权重,PR都会分散到这几个网址上,虽然,它们都是一个网站,而这不是我们想要的结果。那么,如何将以上的首页形式都定向到自己想要的网址上呢,比如http://www.,从而使得这些分散的网页权重,PR都集中到www.上。这里就需要使用301永久重定向了。
ASP语言下,需要在默认首页,如index.asp顶部最上方加入以下代码:
Dim dm,sn
dm=Request.ServerVariables("Server_name") '获取域名
'这里的3是指www的长度
if left(dm,3)<>"www" then
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "http://www."
Response.End
end if
%>
也可以根据实际需要对本代码进行适当的修改以适合你需求的样式。本代码自动校验没有输入www的,301跳转到www.这个网址上,从而使得网页权重得到累加,达到SEO优化的目的。
问题:
如果有链接指向到http://www./index.asp(比如站内链接),那么搜索引擎也同样会给这个网址形式加分,虽然index.asp是默认首页,但我们希望的是把所有权重都给与http://www.这个形式。有人说,这两个形式不是都一样吗?不一样。比如:http://www.的PR为0,而http://www./index.asp的PR为2。从这点可以看出,SE是给与是否有index.asp的网址形式以不同的权重的。而使用Request.ServerVariables("SCRIPT_NAME")或Request("url")获取到的后缀无论输入时是否带有index.asp都一律返回index.asp,从而导致无法判断,也无法使用301重定向,当然这是指仅asp语言环境。
解决方法:
利用js获取当前网址window.location.href,然后把这个当前网址写入cookies;asp读取这个cookies,从而判断网址中是否包含index.asp,如果包含,就使用301重定向。建议:在任何链接中避免有直接指向index.asp的形式,包括外链及内链,尤其是内链。这只是一个折中的方法。
利用js通过cookies给asp传递网址:
<script language="javascript">
var url=window.location.href.toLowerCase(); //小写
document.cookie = "urlck" + "=" + escape(url);
</script>
<%
Dim sn
sn=request.cookies("urlck") '获取后缀
response.cookies("urlck")="" '清空cookies
if right(sn,11)="default.asp" then
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "http://www."
Response.End
end if
%>
但是很遗憾,如果这些网址形式不是实际上的人为输入,而是搜索引擎访问的结果,搜索引擎又是忽略JS的,也就是说,js里赋值的cookie并不能被SE识别,从而导致也无法使用301跳转。这个问题有待解决。
其他语言下的301重定向:
1、Unix/Linux+Apache主机,在.htaccess文件中增加301转向指令,采用 mod_rewrite 技术,如:PHP代码
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteRule ^(.*)$ http:///$1 [L,R=301]
2、Window+IIS主机,在服务器软件的系统管理员配置中设置,方法:
打开Internet信息服务管理器,在欲重定向的网页或目录上按右键,选中“重定向到URL”,在对话框中输入目标页面的地址,记得选中“资源的永久重定向”->“应用” 。
3、用PHP/ASP .NET实现301转向(HTML无法做301转向),方法如下:
1)用PHP实现
Header( "Location: http://" );?>
2)用ASP.NET实现
ASP/Visual Basic代码
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://");
}
</script>
经过这些设置后,301转向应该可以配置OK啦,如果想检查一下是否正确,则可以使用网上提供Server Header检查工具,如Check Server Headers Tool - HTTP Status Codes Checker。
用以上检测http状态码工具,可以做个简单的检查,如检查http://,返回的结果:
#1 Server Response: http://
HTTP Status Code: HTTP/1.1 301 Moved Permanently
Connection: close
Date: Mon, 25 Feb 2008 01:54:09 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Location: http://www.
Content-Length: 0
Content-Type: text/html
Set-Cookie: ASPSESSIONIDACBCSBDR=FCJELLLALFNPOCMBNMOLMJHN; path=/
Cache-control: private
Redirect Target: http://www.
#2 Server Response: http://www.
HTTP Status Code: HTTP/1.1 200 OK
Connection: close
Date: Mon, 25 Feb 2008 01:54:13 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 29330
Content-Type: text/html
Set-Cookie: ASPSESSIONIDACBCSBDR=GCJELLLAECPBADKMADAJOBLC; path=/
Cache-control: private
注意,以上返回的结果中第二行“HTTP Status Code: HTTP/1.1 301 Moved Permanently”,说明这个网址采用了301永久重定向功能了,设置成功。
本节内容:
php排序算法的实现代码
为大家分享PHP各种排序算法的实现,带注释版本,很有用的东西,建议收藏。
例子:
<?php
// 冒泡排序
function BubbleSort($arr) {
// 获得数组总长度
$num = count($arr);
// 正向遍历数组
for ($i = 1; $i < $num; $i++) {
// 反向遍历
for ($j = $num - 1; $j >= $i ; $j--) {
// 相邻两个数比较
if ($arr[$j] < $arr[$j-1]) {
// 暂存较小的数
$iTemp = $arr[$j-1];
// 把较大的放前面
$arr[$j-1] = $arr[$j];
// 较小的放后面
$arr[$j] = $iTemp;
}
}
}
return $arr;
}
// 交换法排序
function ExchangeSort($arr){
$num = count($arr);
// 遍历数组
for ($i = 0;$i < $num - 1; $i++) {
// 获得当前索引的下一个索引
for ($j = $i + 1; $j < $num; $j++) {
// 比较相邻两个的值大小
if ($arr[$j] < $arr[$i]) {
// 暂存较小的数
$iTemp = $arr[$i];
// 把较大的放前面
$arr[$i] = $arr[$j];
// 较小的放后面
$arr[$j] = $iTemp;
}
}
} // www.
return $arr;
}
// 选择法排序
function SelectSort($arr) {
// 获得数组总长度
$num = count($arr);
// 遍历数组
for ($i = 0;$i < $num-1; $i++) {
// 暂存当前值
$iTemp = $arr[$i];
// 暂存当前位置
$iPos = $i;
// 遍历当前位置以后的数据
for ($j = $i + 1;$j < $num; $j++){
// 如果有小于当前值的
if ($arr[$j] < $iTemp) {
// 暂存最小值
$iTemp = $arr[$j];
// 暂存位置
$iPos = $j;
}
}
// 把当前值放到算好的位置
$arr[$iPos] = $arr[$i];
// 把当前值换成算好的值
$arr[$i] = $iTemp;
}
return $arr;
}
// 插入法排序
function InsertSort($arr){
$num = count($arr);
// 遍历数组
for ($i = 1;$i < $num; $i++) {
// 获得当前值
$iTemp = $arr[$i];
// 获得当前值的前一个位置
$iPos = $i - 1;
// 如果当前值小于前一个值切未到数组开始位置
while (($iPos >= 0) && ($iTemp < $arr[$iPos])) {
// 把前一个的值往后放一位
$arr[$iPos + 1] = $arr[$iPos];
// 位置递减
$iPos--;
}
$arr[$iPos+1] = $iTemp;
}
return $arr;
}
// 快速排序
function QuickSort($arr){
$num = count($arr);
$l = $r = 0;
// 从索引的第二个开始遍历数组
for ($i = 1;$i < $num; $i++) {
// 如果值小于索引1
if ($arr[$i] < $arr[0]) {
// 装入左索引数组(小于索引1的数据)
$left[] = $arr[$i];
$l++;
} else { // www.
// 否则装入右索引中(大于索引1的数据)
$right[] = $arr[$i];
$r++; //
}
}
// 如果左索引有值 则对左索引排序
if($l > 1) {
$left = QuickSort($left);
}
// 排序后的数组
$new_arr = $left;
// 将当前数组第一个放到最后
$new_arr[] = $arr[0];
// 如果又索引有值 则对右索引排序
if ($r > 1) {
$right = QuickSort($right);
}
// 根据右索引的长度再次增加数据
for($i = 0;$i < $r; $i++) {
$new_arr[] = $right[$i];
}
return $new_arr;
}
?>
本节内容:
php日期与时间函数
PHP提供了很多的处理日期和时间的函数,包括time()、date()、mktime()、checkdate()、microtime()、strtotime()等,详细的日期时间函数列表可以查看php手册。
下面来介绍下,php中的日期与时间函数。
1,time()
time()函数,它返回当前的UNIX时间戳。什么是UNIX时间?
所谓的UNIX时间戳是从Unix 纪元 (格林威治时间1970年1月1日00:00:00)到当前时间的秒数。 time()函数的实例很简单,直接调用该函数就可以,
例子:
echo time(); // return "1264668961"
?>
2,date()
需要将UNIX时间戳转换为可阅读的当前时间,就要用到date()函数。
date函数的原型如下:
d - 月中的天 (01-31)
m - 当前月,以数字计 (01-12)
Y - 当前的年(四位数)
例子:
echo date("Y/m/d");
echo "<br />";
echo date("Y.m.d");
echo "<br />";
echo date("Y-m-d");
?>
输出:
2013/11/21
2013.11.21
2013-11-21
3,mktime()
mktime() 函数返回一个日期的 Unix 时间戳。
参数说明:
minute (可选) 规定分钟。
second (可选) 规定秒。
month (可选) 规定用数字表示的月。
day (可选) 规定天。
year (可选) 规定年。在某些系统上,合法值介于 1901 - 2038 之间。不过在 PHP 5 中已经不存在这个限制了。
is_dst (可选) 如果时间在日光节约时间(DST)期间,则设置为1,否则设置为0,若未知,则设置为-1。
参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。
参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。
注释:
自 5.1.0 起,is_dst 参数被废弃。因此应该使用新的时区处理特性。
自 5.1.0 器,该函数自动校正越界的输入,而之前的版本会返回false
mktime() 函数对于日期运算和验证非常有用。它可以自动校正越界的输入
例子:
echo(date("M-d-Y",mktime(0,0,0,12,36,2001)));
echo(date("M-d-Y",mktime(0,0,0,14,1,2001)));
echo(date("M-d-Y",mktime(0,0,0,1,1,2001)));
echo(date("M-d-Y",mktime(0,0,0,1,1,99)));
?>
输出:
Jan-05-2002
Feb-01-2002
Jan-01-2001
Jan-01-1999
4,checkdate()
checkdate() 函数验证一个格里高里日期。
如果指定的值合法,则该函数返回 true,否则返回 false。
日期在下列情况下为合法:
month 介于且包括 1 - 12
Day 的值在给定的 month 所应该具有的天数范围之内,闰年已经考虑进去了。
year 介于且包括 1 到 32767
语法
checkdate(month,day,year)
参数
month 必需。规定月。
day 必需。规定日。
year 必需。规定年。
例子:
var_dump(checkdate(12,31,2000));
var_dump(checkdate(2,29,2003));
var_dump(checkdate(2,29,2004));
?>
输出:
bool(true)
bool(false)
bool(true)
>>> 查看更多 php入门教程 <<<