使用 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 扩展名的空白。不确定这是否是由 wordpress 引起的。 我想通了。在 wordpress 放置的标准 RewriteRule ^index\.php$ - [L] 之后,我有我的重写规则。因此,我的重写没有被处理。把它移到上面然后繁荣……它起作用了。感谢您更正我的规则! 是的 WP 规则需要在此之后,否则该规则会抓取所有请求。很高兴它对你有用。 是的,“新” WP 表单本身必须在 .htaccess 中翻译(重写)为服务器和 PHP 可以理解的表单(/index.php?year=yyyy&month=毫米&...等)。这必须发生在您从“旧”WP 格式转换为“新”格式之后。因此,您的转换/重写必须在 其他任何事情之前发生。顺便说一句,如果您完全理解它是什么,也可以将您的“旧”格式直接重写为最终的 WP“真实”格式。以上是关于使用 htaccess 和 regex 重写旧 URL的主要内容,如果未能解决你的问题,请参考以下文章
使用 htaccess 进行自动版本控制:htaccess regex Rewrite rule not pick up pattern