htaccess 将所有子页面重定向到父页面,除了一些父页面

htaccess 将所有子页面重定向到父页面,除了一些父页面

我想将所有子页面与父页面匹配,正在使用 wordpress,这会弄乱图像和 wordpress 文件吗?我有标签和类别,我想将它们从此规则中排除。

RewriteRule ^(.*/). https://www.example.com/$1 [R=301,L]

这是 htaccess 规则。假设我想从此规则中排除https://example.com/year/1999、等。我该怎么做?https://example.com/year/1979

答案1

RewriteRule ^(.*/). https://www.example.com/$1 [R=301,L]

这会弄乱图像和 wordpress 文件吗?

是的,正如所写,该规则将删除所有对静态资产(图像、CSS、JS 等)的请求的文件名。您需要排除此类请求(也许最简单的方法是排除任何映射到物理文件的请求)。

另请注意,这目前取决于您重定向到其他主持人(例如,如评论中所述,从站点 A 到站点 B)。否则,您将遇到重定向循环,最终将您带到顶部“文件夹”。/foo/bar/baz/qux例如/foo/bar/baz/

例如,以下内容应位于根文件的顶部附近.htaccess,WordPress 代码块之前。

RewriteCond %{REQUEST_URI} !^/year/19(79|99)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+/). https://www.example.com/$1 [R=302,L]

首先状况排除以下任何 URL开始 /year/1999/year/1979。第二个状况排除任何映射到物理文件的请求(例如静态资产)。

!上的前缀条件模式对表达式取反,因此当表达式不匹配时则成功。

我只是改变了RewriteRule 图案(.*/)到,(.+/)因为斜线前总是至少有 1 个字符,而不是 0 个。这实际上并没有什么区别,但在我看来,这样读起来更清楚。

请注意,在 WordPress 重写对前端控制器的请求(即/index.php)后,重写引擎实际上会重新开始,并再次处理上述规则。然而,在第二次传递时RewriteRule 图案 ^(.+/).将不匹配,因此在这方面不需要做任何额外的事情。

您需要先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。(这真的是永久的吗?)

相关内容