使用 htaccess 和 regex 重写旧 URL

Posted

技术标签:

【中文标题】使用 htaccess 和 regex 重写旧 URL【英文标题】:Rewrite old URLs using htaccess and regex 【发布时间】:2014-01-04 05:38:07 【问题描述】:

我在运行的基于 WordPress 的网站上遇到了关于 .htaccess 文件中的重写规则的问题。

最近对网站进行了大修,我的永久链接结构发生了变化。以前是

/%year%/%monthnum%/%postname%.html

现在是

/%year%/%monthnum%/%postname%/

我遇到的问题是 Google 存储了所有 .html 链接。因此,通过 Google 访问链接的访问者会收到 404。

我想要发生的是,只要传入的 URL 以 .html 结尾并匹配永久链接结构格式,就重定向到相同的 URL,只是没有 html 扩展名。

我尝试将重写规则添加到我的 .htaccess 文件中,但遇到了无法正常工作的问题。我不确定那是什么问题。

RewriteEngine On
RewriteBase /mywebsite.com/
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([0-9]4+)/([0-9]2+)/([a-zA-Z0-9-]+).html$ $1/$2/$3/

【问题讨论】:

【参考方案1】:

你已经接近了,但你的正则表达式有点偏离轨道。试试这个规则:

RewriteEngine On
RewriteBase /mywebsite.com/
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([0-9]4)/([0-9]2)/(.+?)\.html$ $1/$2/$3/ [L,NC,NE,R=301]

【讨论】:

感谢您的快速回复。我已经实现了您的版本,但它仍然无法正常工作。问题仍然是页面只是加载了带有 html 扩展名的空白。不确定这是否是由 w​​ordpress 引起的。 我想通了。在 wordpress 放置的标准 RewriteRule ^index\.php$ - [L] 之后,我有我的重写规则。因此,我的重写没有被处理。把它移到上面然后繁荣……它起作用了。感谢您更正我的规则! 是的 WP 规则需要在此之后,否则该规则会抓取所有请求。很高兴它对你有用。 是的,“新” WP 表单本身必须在 .htaccess 中翻译(重写)为服务器和 PHP 可以理解的表单(/index.php?year=yyyy&month=毫米&...等)。这必须发生在您从“旧”WP 格式转换为“新”格式之后。因此,您的转换/重写必须在 其他任何事情之前发生。顺便说一句,如果您完全理解它是什么,也可以将您的“旧”格式直接重写为最终的 WP“真实”格式。

以上是关于使用 htaccess 和 regex 重写旧 URL的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 重定向 301 + 重写冲突

.htaccess 重定向 .php 和 .html 请求

.htaccess 从子目录重写到根目录

正则表达式在.htaccess中重写规则

使用 htaccess 进行自动版本控制:htaccess regex Rewrite rule not pick up pattern

htaccess 将旧域重定向到新域