htaccess 文件中使用通配符的 301 重定向不起作用

301 redirect with wildcard in htaccess file not working

我正在尝试重定向这些页面

至此

使用这条线:

Redirect 301    /reviews/page/./    /reviews/

但它不起作用。我尝试了其他组合,例如 .*^.*$,但没有任何效果。只有特定的 URL 会被重定向到新的。

是否有任何其他因素会干扰我正在尝试工作的线路?也许 space、大写、小写、缩进等等?

下面粘贴了整个文件。

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/ [R,L]
# 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]
</IfModule>

# END WordPress
#  --------------------------------
# | ADDITIONAL RULES               |
#  --------------------------------
<FilesMatch "^robots\.txt">
Order Allow,Deny
Allow from all
</FilesMatch>
<FilesMatch "^\.htaccess|.*\.cgi">
Order Deny,Allow
Deny from all
</FilesMatch>

Redirect 301    /reviews/page/./    /reviews/

mod_aliasRedirect指令是前缀匹配,它不接受通配符或正则表达式。所以,理论上你可以这样做:

Redirect 301 /reviews/page/ /reviews/

但是,如前所述,Redirect 指令是前缀匹配的, 匹配后的所有内容都被复制到目标 URL 的末尾。因此,对 /reviews/page/2/ 的请求将被重定向到 /reviews/2/ - 这是不可取的。

您可以改用 RedirectMatch,它使用正则表达式而不是简单的前缀匹配。但是,由于您已经在使用 mod_rewrite (RewriteRule) 指令,因此最好为此使用 mod_rewrite 以避免潜在的冲突。不同的 Apache 模块在请求期间的不同时间执行,与配置文件中这些指令的明显顺序无关。

相反,在 .htaccess 文件的顶部尝试以下 mod_rewrite 指令,紧跟在 RewriteEngine 指令之后:

RewriteRule ^reviews/page/[23]/$ /reviews/ [R=302,L]

这匹配 /reviews/page/2//reviews/page/3/ 的任何请求并重定向到 /reviews/23 使用 字符 class 匹配。请注意,在每个目录 .htaccess 文件中,RewriteRule 模式 匹配的 URL 路径不以斜杠开头。

这也是 302(临时)重定向。将其更改为 301(永久)重定向 - 如果这是意图 - 但只有在您测试它工作正常之后。 301 被浏览器硬缓存,因此会使测试出现问题。

您需要在测试前清除浏览器缓存。


更新: 要匹配任何数字,您可以将 [23] 更改为 \d(数字的 shorthand 字符 class .要匹配1个或2个数字,可以用\d{1,2}.例如:

RewriteRule ^reviews/page/\d{1,2}/$ /reviews/ [R=302,L]

您可以使用 .(点)来匹配任何字符。但是,这对于看起来像页码的内容来说可能过于宽泛。正则表达式 (regex) 应尽可能具有限制性。