php - Htaccess 替换 WordPress 中的 URL 片段?

标签 php .htaccess

问题

我想从 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:https://webmasters.stackexchange.com/questions/102402/how-to-bulk-redirect-urls-and-replace-one-path-segment

对于解决方案 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...

htaccess

使用 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/

相关文章:

php - 如何设置入站邮件 Controller 以便用户可以向唯一的电子邮件地址发帖?

php - Joomla 3.4.4 多语言 url

php - .htaccess 从子域重定向到子域

.htaccess - 使用 .htaccess 强制 HTTPS 导致重定向循环

.htaccess - 使用 htaccess,将用户重定向到 SSL 域并从那里登录是否安全?

apache - RewriteRule ssl conf结合各种

php - where 子句中的 MYSQL 别名

php - Doctrine 2 : bi-directional relation, 添加不拥有的实体将不会持续存在

php - WordPress 包含 ("../../../wp-blog-header");失败

php - 如果数组中的数据存在,自动生成 JS 变量 PHP/MySQL