htaccess 文件中使用通配符的 301 重定向不起作用
301 redirect with wildcard in htaccess file not working
我正在尝试重定向这些页面
/reviews/page/2/
/reviews/page/3/
至此
/reviews/
使用这条线:
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/
。 2
或 3
使用 字符 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) 应尽可能具有限制性。
我正在尝试重定向这些页面
/reviews/page/2/
/reviews/page/3/
至此
/reviews/
使用这条线:
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/
。 2
或 3
使用 字符 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) 应尽可能具有限制性。