Drupal网站在Site information的设置中有一个404错误页面可以定制到自己希望的网址,如果你在日志中发现大量404错误,而其中很多都是同一个类型可以引导到对用户更有帮助的内容页面,那么就可以在这个定制的404错误网址中进行判断、导向。
我做的例子是http://ak.postcodebase.com/not_found ,因为来自外部网站的链接中,有一部分是这个站内找不到或者错误的邮编,就可以根据URI进行判断:
- 如果访问9位邮编页面不存在但前面5位邮编分类页面存在,则转到5位邮编分类页面;
- 如果访问9位邮编页面不存在且前面5位邮编分类页面也不存在,则转到首页;
- 如果访问5位邮编分类页面不存在,则转到首页;
- 其它不属于上面的情况,则直接返回404 not found信息。
程序是用PHP编写的,跳转可以用这样的语句实现:header("Location: $new_url",TRUE,302);
我们前一阵子在Google Webmaster Tools中发现很多报错的页面,当时用修改Apache .htaccess来判断、重定向的,其实也可以用上面的PHP程序来判断、定向。直接用.htaccess适用于比较简单的匹配判断,而PHP适用于比较复杂的匹配判断。
评论10
更多.htaccess处理例子
下面是更多的几个例子:
注意,Apache ReWrite虽然很强大,但条件、匹配、替换等还是有些复杂,可以先限定在少数页面进行测试,没有问题了再推广,免得影响正在使用的网站访问。
语言链接错误的纠正例子
Drupal 6中葡萄牙语的代码是pt-pt,Drupal 7中是pt,如果Drupal 6网站中没有对葡萄牙语的代码做处理就直接链接到Drupal 7的网站中,就会在Drupal 7中出现找不到页面的报错,这时候需要修改Drupal 6网站的PHP模板,还可以修改Drupal 7网站的.htaccess,把错误页面自动重定向到正确的网址,例如:
反过来Drupal 7中的pt指向Drupal 6的pt-pt也需要变换,Drupal 7中的fil语言在Drupal 6中没有,就可以指向默认的英文版。
RewriteCond %{HTTP_HOST} ^(gb
RewriteCond %{HTTP_HOST} ^(gb|gbr|nzl|sgp)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/pt-pt(.*)$ RewriteRule ^pt-pt(.*)$ m/pt$1 [L,R=301] RewriteCond %{HTTP_HOST} ^(gb|gbr|nzl|sgp)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/pt-pt(.*)$ RewriteRule ^pt-pt(.*)$ /pt$1 [L,R=301]RewriteCond %{HTTP_HOST}
RewriteCond %{HTTP_HOST} ^bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/pt-pt(.*)$ RewriteRule ^pt-pt(.*)$ m/pt$1 [L,R=301] RewriteCond %{HTTP_HOST} ^bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/pt-pt(.*)$ RewriteRule ^pt-pt(.*)$ /pt$1 [L,R=301]手机版网站出现多个/m的纠正
Google Webmaster Tools中有网址找不到的404报错:
http://in.mingluji.com/m/mt/m/business_directory/American_Trucking_Tax_Assoc
链接到您网站网页的域为:
http://in.mingluji.com/m/m/business_directory/American_Trucking_Tax_Assoc
这种网址中带有/m/m/的页面不知道是怎么会出现的,页面可以访问,但源代码中的多语言链接就出现了上面那种404错误。
需要将/m/m/改为一个/m/,在.htaccess用下面的语句可以实现:
#下面的写法有误,会出现无限循环
#下面的写法有误,会出现无限循环 #RewriteCond %{HTTP_HOST} ^(|m\.)sale\.mingluji\.com(.*)$ #RewriteCond %{REQUEST_URI} ^\/pt(.*)$ #RewriteRule ^pt(.*)$ /pt-pt$1 [L,R=301] RewriteCond %{HTTP_HOST} ^(|m\.)sale\.mingluji\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/pt\/(.*)$ RewriteRule ^pt(.*)$ /pt-pt$1 [L,R=301] #for sale.mingluji.com/pt(pt后面无/) RewriteCond %{HTTP_HOST} ^(|m\.)sale\.mingluji\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/pt$ RewriteRule ^pt$ /pt-pt [L,R=301] RewriteCond %{HTTP_HOST} ^(|m\.)sale\.mingluji\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/fil(.*)$ RewriteRule ^fil(.*)$ $1 [L,R=301]RewriteCond %{HTTP_HOST} ^
RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/pt\/(.*)$ RewriteRule ^pt(.*)$ /pt-pt$1 [L,R=301] RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/pt\/(.*)$ RewriteRule ^pt(.*)$ m/pt-pt$1 [L,R=301]RewriteCond %{HTTP_HOST} ^
RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/pt$ RewriteRule ^pt$ /pt-pt [L,R=301] RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/pt$ RewriteRule ^pt$ m/pt-pt [L,R=301] RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/fil(.*)$ RewriteRule ^fil(.*)$ $1 [L,R=301] RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/fil(.*)$ RewriteRule ^fil(.*)$ m/$1 [L,R=301]#在fil语言后面增加/
#在fil语言后面增加/,要不然个别站点涉及到files的进行了错误的替换,导致正常的页面打不开。 RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/fil\/(.*)$ RewriteRule ^fil(.*)$ $1 [L,R=301] RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/fil\/(.*)$ RewriteRule ^fil(.*)$ m$1 [L,R=301] #然后再单独增加一个fil在最后的不带/的页面情况 RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/fil$ RewriteRule ^fil$ $1 [L,R=301] RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/fil$ RewriteRule ^fil$ m/$1 [L,R=301]RewriteCond %{HTTP_HOST} ^
RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/fil$ RewriteRule ^fil$ m/$1 [L,R=301] 更改为: RewriteCond %{HTTP_HOST} ^(chn|are|bel|fra|ita|esp|twn|che|aus|aut|can|hkg|us|government-contractor)\.bizdirlib\.com(.*)$ RewriteCond %{REQUEST_URI} ^\/m\/fil$ RewriteRule ^fil$ m [L,R=301]