在htaccess文件中使用通配符301重定向无法正常工作

时间:2017-10-25 15:46:29

标签: .htaccess mod-rewrite mod-alias

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

  • /reviews/page/2/
  • /reviews/page/3/

到这个

  • /reviews/

使用这一行:

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

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

还有什么可能会影响我尝试工作的路线吗?也许是空格,大写,小写,缩进等?

整个文件粘贴在下面。

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

1 个答案:

答案 0 :(得分:1)

mod_alias Redirect指令是前缀匹配,它不接受通配符或正则表达式。所以,理论上你可以做类似的事情:

Redirect 301 /reviews/page/ /reviews/

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

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

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

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

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

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

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

更新:要匹配任何数字,您可以将[23]更改为\d(数字的速记字符类。要匹配1或2位数,您可以使用{{ 1}}。例如:

\d{1,2}

您可以使用RewriteRule ^reviews/page/\d{1,2}/$ /reviews/ [R=302,L] (点)来匹配任何字符。但是,对于看起来像页码的内容,这可能过于宽泛。正则表达式(正则表达式)应尽可能具有限制性。