当主机名重复两次时,Htaccess规则解决404错误

时间:2013-06-26 05:32:21

标签: .htaccess url-rewriting

我们使用无限制的站点地图生成器生成xml站点地图,它会占用站点中的所有网址。很抱歉,在网站管理员的抓取错误部分中发现错误。站点地图提取大量网址作为重复网址。

例如:如果实际网址是“http://www.example.com/forum/viewtopic.php?f=5&t=221&st=0&sk=t&sd=a&start=10

站点地图获取此网址以及重复的网址,将404错误返回为“http://www.example.com/http://www.example.com:80/forum/viewtopic.php?f=5&t=221&st=0&sk=t&sd=a&start=10

(这只是一个示例网址。)

站点地图中列出的所有其他网址都是正确的。问题仅在论坛部分。(使用phpbb进行论坛)。

任何人都可以建议任何有效的htaccess规则来避免这个404。 我想将所有模式(例如“http://www.example.com/http://www.example.com:80/forum/ ....”)重定向到“http://www.example.com/forum/ .........”

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

通过httpd.conf启用mod_rewrite和.htaccess,然后将此代码放在.htaccess目录下的DOCUMENT_ROOT中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+.+?(/forum/[^\s]+) [NC]
RewriteRule ^ /%1 [R=302,L,NE]

验证一切正常后,将R=302替换为R=301。在测试mod_rewrite规则时,请避免使用R=301(永久重定向)。

<强>解释

%{THE_REQUEST}表示Apache收到的原始请求,在您的情况下可能如下所示:GET /http://www.example.com:80/forum/viewtopic.php?f=5&t=221&‌​st=0&sk=t&sd=a&start=10 HTTP/1.0

打破我的正则表达式:^[A-Z]{3,}\s/+.+?(/forum/[^\s]+)现在

  1. 这部分正则表达式^[A-Z]{3,}\s匹配'GET '部分输入。
  2. 这部分正则表达式/+.+?匹配/http://www.example.com:80部分输入(.+?是不情愿的匹配,直到正则表达式的下一部分,即/forum/开始。
  3. 这部分正则表达式/forum/与输入的文字/forum/部分相匹配。
  4. 这部分正则表达式[^\s]+匹配/viewtopic.php?f=5&t=221&‌​st=0&sk=t&sd=a&start=10部分输入。 (直到找到一个空格)。
  5. (/forum/[^\s]+)/forum/viewtopic.php?f=5&t=221&‌​st=0&sk=t&sd=a&start=10放入匹配组#1(稍后在RewriteRule中用%1表示)
  6. 当RewriteCond为真时,RewriteRule ^ /%1 [R=302,L,NE]正在执行。然后,此规则会将请求重定向到上面捕获的%1