我想将所有子页面与父页面匹配,正在使用 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(临时)重定向进行测试,以避免潜在的缓存问题。(这真的是永久的吗?)