问题
我想从 website.com/PRODUCT/name-of-item
重定向到 website.com/COURSES/name-of-item
。产品太多,无法单独完成。
此外,由于术语product
有时确实会出现在name-of-item
部分(例如product-best- rating
) ,我需要注意这一点。
许多用户都提出了类似的问题。我已经尝试过这些解决方案,但它们对我不起作用。
我尝试过的方法 - 解决方案 1
解决方案1:Rewrite only the middle part of URL - mod rewrite .htaccess
我的解决方案 1 的代码是这样的:
# 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]
RewriteRule ^product/(.*)$ /courses/$1 [R=302,NE,L]
</IfModule>
# END WordPress
结果:https://website.com/product/normal-product/仍然重定向到https://website.com/product/normal-product/
我尝试过的方法 - 解决方案 2
对于解决方案 2,我的代码如下:
# 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]
RewriteRule ^/?product/(.*)$ https://website.com/courses/$1 [R=301,L]
</IfModule>
# END WordPress
结果:https://website.com/product/normal-product/仍然重定向到https://website.com/product/normal-product/
最佳答案
I have checked it and don't see anything that is conflicting.
WordPress 前端 Controller 本身与重定向发生冲突。通过将您的指令放在 WP 指令之后,它永远不会被处理。
您需要将重定向(解决方案 1 或 2 中的指令看起来不错)放在 WordPress 前端 Controller 之前。事实上,您应该将其放在 # BEGIN WordPress
block 之前(靠近文件开头),因为 WordPress 会尝试维护这部分代码并覆盖任何自定义指令。
例如:
RewriteRule ^product/(.*) /courses/$1 [R=302,NE,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
:
您无需重复 RewriteEngine On
指令。
RewriteRule
上的尾随 $
模式 是多余的,因为默认情况下正则表达式是贪婪的。
UPDATE: When you said "you don't need to repeat RewriteEngine On", do you mean that I can remove A Or do you mean B in this diagram...
使用 WordPress,您应该避免手动编辑由 WordPress(或插件)维护的任何部分中的代码。如果您确实编辑了此代码,它可能会在稍后被覆盖(由 WordPress)。
因此,您永远不应该手动编辑 # BEGIN WordPress
和 # END WordPress
注释标记之间的代码。我假设这同样适用于 # BEGIN Security Block
。因此,您可能应该将两个 RewriteEngine On
指令保留在原处(尽管第一个指令实际上是多余的)。
您在 WordPress .htaccess
文件中获得多个 RewriteEngine On
指令的原因是您可能有多个插件都在编辑 .htaccess
文件并注入(inject)自己的指令。每个都包含一个 RewriteEngine On
指令,因为它们不知道 .htaccess
文件中还有什么。
但是,从 Apache/.htaccess 的角度来看,只有 RewriteEngine
指令的最后一个实例会执行任何操作 - 并且这控制着整个文件。因此,如果您手动编写这些指令,那么顶部只会有一个 RewriteEngine On
指令(只是因为这样更具可读性 - 但顺序并不重要)。
您可以在文件的最后编写一个 RewriteEngine Off
指令,这将禁用整个文件的重写引擎,尽管之前有 RewriteEngine On
指令在文件中 - 这些基本上被忽略。这实际上是“注释掉”所有 mod_rewrite 指令的快速方法,而不是在每个指令前面手动使用 #
。
因此,如果 # BEGIN WordPress
block 仍然存在(带有 RewriteEngine On
指令)(您不应编辑该指令),则无需重复RewriteEngine On
指令(如果您在此之上创建自己的自定义重定向)。这就是我一开始真正想说的。
关于php - Htaccess 替换 WordPress 中的 URL 片段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62983276/