当前位置

Drupal中对404错误进行判断、重定向

James Qi 在 2013年5月6日 - 09:49 提交
内容摘要:Drupal网站在Site information的设置中有一个404错误页面可以定制到自己希望的网址,如果你在日志中发现大量404错误,而其中很多都是同一个类型可以引导到对用户更有帮助的内容页面,那......

  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适用于比较复杂的匹配判断。

 

自由标签:

评论

-- 发自IP地址: 58.49.164.69 (位置 | 谁是)

下面是更多的几个例子:

# m.开头的手机版网站,将URI网址开头出现的/m/替换为/
RewriteCond %{HTTP_HOST}  ^(m\.|)114\.mingluji\.com$
RewriteCond %{REQUEST_URI} ^\/m\/(.*)$
RewriteRule ^(.*)$ /$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^jpn\.youbianku\.com(.*)$
RewriteCond %{REQUEST_URI} ^\/m\/category\/admin2\/.*$
RewriteRule ^(.*)\%26\%23039;(.*)$ /m/$1\%27$2 [L,R=301,NE]

注意,Apache ReWrite虽然很强大,但条件、匹配、替换等还是有些复杂,可以先限定在少数页面进行测试,没有问题了再推广,免得影响正在使用的网站访问。

James Qi / 祁劲松

-- 发自IP地址: 89.204.130.130 (位置 | 谁是)

  Drupal 6中葡萄牙语的代码是pt-pt,Drupal 7中是pt,如果Drupal 6网站中没有对葡萄牙语的代码做处理就直接链接到Drupal 7的网站中,就会在Drupal 7中出现找不到页面的报错,这时候需要修改Drupal 6网站的PHP模板,还可以修改Drupal 7网站的.htaccess,把错误页面自动重定向到正确的网址,例如:

RewriteCond %{HTTP_HOST} ^(|m\.)(report|profile)\.bizdirlib\.com(.*)$
RewriteCond %{REQUEST_URI} ^\/pt-pt(.*)$
RewriteRule ^pt-pt(.*)$ /pt$1 [L,R=301]

  反过来Drupal 7中的pt指向Drupal 6的pt-pt也需要变换,Drupal 7中的fil语言在Drupal 6中没有,就可以指向默认的英文版。

James Qi / 祁劲松

-- 发自IP地址: 111.174.199.169 (位置 | 谁是)

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]

-- 发自IP地址: 111.174.199.169 (位置 | 谁是)

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]

-- 发自IP地址: 89.204.155.27 (位置 | 谁是)

Google Webmaster Tools中有网址找不到的404报错:

http://in.mingluji.com/m/mt/m/business_directory/American_Trucking_Tax_A...

链接到您网站网页的域为:

http://in.mingluji.com/m/m/business_directory/American_Trucking_Tax_Assoc

这种网址中带有/m/m/的页面不知道是怎么会出现的,页面可以访问,但源代码中的多语言链接就出现了上面那种404错误。

需要将/m/m/改为一个/m/,在.htaccess用下面的语句可以实现:

RewriteCond %{HTTP_HOST} ^(.*)\.mingluji\.com$
RewriteCond %{REQUEST_URI} ^\/m\/m\/
RewriteRule ^(.*) /m/$1 [L,R=301]

James Qi / 祁劲松

-- 发自IP地址: 111.173.190.221 (位置 | 谁是)

#下面的写法有误,会出现无限循环
#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]

-- 发自IP地址: 58.49.166.73 (位置 | 谁是)

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]

-- 发自IP地址: 58.49.166.73 (位置 | 谁是)

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]

-- 发自IP地址: 59.172.50.183 (位置 | 谁是)

#在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]

-- 发自IP地址: 59.172.50.183 (位置 | 谁是)

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]

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
验证码
本问题用于测试您是否为人类访问者,避免自动垃圾发贴。
图形验证
键入显示在图片中的字符