【问题标题】:.htaccess mod-rewrite regex apache confusion results in 10k 404's per day.htaccess mod-rewrite regex apache 混淆导致每天 10k 404
【发布时间】:2011-12-22 22:40:11
【问题描述】:

我已经查看了此处发布的与 .htaccessapachemod-rewriteregex 相关的许多问题,但我就是不明白。我尝试了一些不同的事情,但要么我把事情复杂化了,要么犯了初学者的错误。无论如何,我已经做了几天了,并且随着每天 10000 404 的显示,我已经完全把事情搞砸了。

我的网站

我有一个 WordPress 网站,其中包含 23,000 多个帖子,分为 1200 多个类别。该网站以流媒体视频文件、行业新闻、节目评论、电影、phpbb 论坛等为特色,结构如下:

  • 站点/基本类别(0 和 a-z)/子类别(系列名称)/ 所有流媒体剧集的帖子(剧集名称 .html)
  • 所有流媒体电影的站点/电影/帖子 title.html
  • 网站/新闻/posttitle.html
  • 网站/评论/posttitle.html
  • site / page.html 用于各种页面
  • 网站/论坛

固定链接结构是/%category%/%postname%.html

我正在使用 Yoast Wordpress SEO 插件,并且可以选择为目录和类别附加一个尾随斜杠。

这是当前的.htaccess

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    # END WordPress

我的例子

从我们的旧网站结构中,我们有许多使用“/episode title/”的入站链接。这是错误的。我们需要这些传入链接重定向到 /watch-anime/letter,数字或符号只有 1 个字符长/系列标题/剧集标题.html

/one-piece-episode-528​/

应该是

/watch-anime/o/one-piece/​one-piece-episode-528​.html

我犯的一个错误导致了这个问题...“/watch-anime/letter/series title/episode title/”到“/watch-anime/letter/series title/episode title.html”。因此,我们需要从单个帖子中删除尾部斜杠并添加 .html

/watch-anime​/w​/welcome-to-the-nhk​/welcome-to-the-nhk-episode-14​/

应该是

/watch-anime​/w​/welcome-to-the-nhk​/welcome-to-the-nhk-episode-14​.html

同样的错误结合旧的站点结构问题导致了这个问题...“/episode title.html”需要是“/watch-anime/letter/series title/episode title.html

/one-piece-episode-528​.html

需要

/watch-anime/o/one-piece/​one-piece-episode-528​.html

如您所见,在迁移网站帖子结构和尝试修复它之间,我把事情搞砸了。我现在请求您提供任何帮助,以获取将处理这些 301 重定向的正确 .htaccess 文件。

感谢您提供的任何帮助!

【问题讨论】:

  • 想在问题中包含您当前的 .htaccess 文件吗?
  • 请告诉我你的 URI 路径中不是 空格
  • 不,URL 中没有空格。当前的 .htaccess 是相当默认的。当我无法让它工作时,我把所有东西都拿出来了。我将编辑帖子并提供一些真实示例。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

我不知道 RewriteMap 是否适用于 .htaccess 文件,但无论如何这是我的虚拟主机解决方案,它应该可以完美运行。

创建一个RewriteMap 文件。见here for more information。这是一个非常简单的文本文件,其中包含:首先,错误的 URL 没有 '/',然后是 一个空格(至少),然后是正确的 url,如下所示:

one-piece-episode-528​ /watch-anime/o/one-piece/​one-piece-episode-528​.html
dexter-season-6-episode-1 /watch-interesting-stuff/d/dexter/dexter-season-6-episode-1.html
breaking-bad-full-season-3 /watch-interesting-stuff/b/breaking-bad/​breaking-bad-full-season-3.html

等等。

将这个简单的文本文件转换为哈希映射。例如:

httxt2dbm -i mapanime.txt -o mapanime.map

现在在您的虚拟主机中声明它:

RewriteMap mapanime \
    dbm:/pathtofile/mapanime.map

所以你的虚拟主机应该看起来像:

<VirtualHost *>
    RewriteEngine On
    RewriteMap mapanime \
        dbm:/pathtofile/mapanime.map
    # don't touch the URL, but try to search if it exists in mapanime
    RewriteRule /([^/]*)/$ - [QSA,NC,E=VARANIME:${mapanime:$1|notfound}]
    # if VARANIME not empty *and*
    #   VARANIME different from "notfound":
    RewriteCond %{ENV:VARANIME} ^(notfound|)$
    # then redirect it to the right URL:
    # QSA = query string append
    # R = redirect, 301 = definitive redirect
    # L = last = don't go further
    RewriteRule . %{ENV:VARANIME} [QSA,R=301,L]
</VirtualHost>

希望这会有所帮助。

我没有看到更简单的解决方案,但我很确定这个解决方案会奏效。

如果它不起作用:阅读我通常的“两个提示”,并在您的问题中添加重写日志。

两个提示:

请尝试使用RewriteLog 指令:它可以帮助您追踪此类问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢的检查正则表达式的工具:

http://www.quanetic.com/Regex(别忘了选择 ereg(POSIX) 而不是 preg(PCRE)!)

【讨论】:

  • 非常感谢您!但我有个问题。创建地图文件时,我是否需要为网站上的每个帖子添加一行?我们现在有超过 21,000 个帖子,如果我对每个帖子都这样做,当我尝试解释三个可能的错误 url 中的每一个时,文件将有超过 84,000 行。也许我又一次把事情复杂化了。工藤在德克斯特的参考资料上。哈哈。如果您改用“绝命毒师”,那只会更好。
  • 坏消息是... yes 您将不得不转储所有相应的数据。但是感谢mysql,这应该是一个孩子的游戏。示例:删除所有短链接:mysql -u username -ppassword wordpressdatabasename -e "select post_name from wp_posts order by post_name;"
  • 如果你想把它们放到一个文件中:mysql -u username -ppassword wordpressdatabasename -e "select post_name from wp_posts order by post_name;" &gt;&gt; filename。然后只需处理该文件。如果我是你的室友,这将需要我几分钟来完成整个工作(我的答案 + 正确的 rewritemap 文件)。
  • 在我的博客上给我留言(查看我的个人资料)(任何帖子都可以),我很乐意为您提供帮助!
  • 我非常感谢奥利弗的帮助。谢谢!我将审查您的链接材料并试一试。我会尽快让您知道结果如何,并且很可能会接受您的帮助!您的博客有英文版吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多