如何在类别固定链接更改后修复类别url 404

时间:2021-01-04 作者:Srinivas08

我正在为一个网站做SEO。因此,我想附加-优惠券代码“;到所有类别URL。

我的基本分类是:商店

我想要实现重定向的示例:

/stores/walmart to /stores/walmart-coupon-codes
由于商店/沃尔玛在谷歌上建立了索引,我想301重定向到新的url

我尝试了htaccess:

RewriteRule ^stores/(.*)/$ /stores/$1-coupon-codes [R=301,NC,L]
这将所有商店链接重定向到/商店优惠券代码,但其404 as原始类别URL不包含-优惠券代码,

如果我将任何permalink更改为包含优惠券代码,那么原始商店URL将变为404,重定向将不起作用。

3 个回复
SO网友:MrWhite

RewriteRule ^stores/(.*)/$ /stores/$1-coupon-codes [R=301,NC,L]
您可能可以使用否定的前瞻断言来排除已经包含-coupon-codes 避免再次被重定向,从而阻止重定向循环(我假设这里发生的就是这样)。

例如:

RewriteRule ^stores/(?!.*-coupon-codes)(.+)/$ /stores/$1-coupon-codes [R=301,NC,L]
消极前瞻(?!...) 当URL已包含时,导致模式匹配失败-coupon-codes.

您需要清除浏览器缓存,我建议首先使用302(临时)重定向进行测试,以避免潜在的缓存问题。

然而,这里有一些不一致之处。。。你举了个例子/stores/walmart (无尾部斜杠)。但是你所说的规则(你说的是重定向)只会重定向包含尾部斜杠的URL。如果原始URL包含尾部斜杠,则此处不会有重定向循环(因为您重定向到的URL不包含尾部斜杠),除非<还有什么东西在后面加斜杠?

UPDATE: 它只适用于结尾带有斜杠的URL。有什么解决办法吗?就像在网站的所有URL上添加斜杠,如果他们还没有斜杠的话。

是的,您可以在上面的正则表达式中使尾部斜杠成为可选的。但是,您还需要创建前面的捕获组(即。(.+)) 不贪婪,即。(.+?) 这样它就不会使用可选的尾部斜杠。例如:

RewriteRule ^stores/(?!.*-coupon-codes)(.+?)/?$ /stores/$1-coupon-codes [R=301,NC,L]
“我不会”;附加斜杠;指向此重定向之前的所有URL,因为这将导致另一个重定向。如果需要的话,您可以自然地在生成的替换字符串中添加斜杠。ie。/stores/$1-coupon-codes/.

我在分页时发现的另一个问题是,URL被破坏了:stores/walmart/page/2-coupon-codes, 像这样附加它

您可以添加一个条件来排除以最后一个路径段中的数字结尾的URL。例如:。/stores/walmart/page/2/<anything>/<number>. 例如:

RewriteCond %{REQUEST_URI} !/\\d+$
RewriteRule ^stores/(?!.*-coupon-codes)(.+?)/?$ /stores/$1-coupon-codes [R=301,NC,L]
The! CondPattern上的前缀(第二个参数RewriteCond 指令)否定比较,因此当正则表达式不匹配时,它是成功的。在这种情况下,如果URL路径不以仅由数字组成的路径段结束,则此操作将成功。

但无法为负前瞻添加有效的正则表达式。

您不需要使用消极的前瞻,您可以使用附加的条件(RewriteCond 指令)代替。例如:

RewriteCond %{REQUEST_URI} !/\\d+$
RewriteCond %{REQUEST_URI} !-coupon-codes/?$ [NC]
RewriteRule ^stores/(.+?)/?$ /stores/$1-coupon-codes [R=301,NC,L]
我并没有在上面提到这一点,因为您似乎已经将指令放在了正确的位置,但这些指令需要放在.htaccess 文件,位于WordPress前端控制器之前。

SO网友:HK89

打开下面的代码。htaccess文件,

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^stores/(.*)/$ /stores/$1-coupon-codes [R=301,NC,L]
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

SO网友:amarinediary

您应该刷新function.php file.

<?php
/**
* flush_rewrite_rules
* Remove rewrite rules and then recreate rewrite rules.
* @link https://developer.wordpress.org/reference/functions/flush_rewrite_rules/
*
* flush_rewrite_rules(); Need to be removed before pushing to live.
* Can be replaced before pushing to live by add_action( \'after_switch_theme\', \'flush_rewrite_rules\' );
*/
flush_rewrite_rules(); ?>
现在要更新一个默认的类别slug,这将影响永久链接,您应该可以在类别管理页面上的管理控制台中进行更新。