【问题标题】:301 redirect with wildcard in htaccess file not working301 在 htaccess 文件中使用通配符重定向不起作用
【发布时间】:2017-10-25 15:46:29
【问题描述】:

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

  • /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/

【问题讨论】:

    标签: .htaccess mod-rewrite mod-alias


    【解决方案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 pattern 匹配的 URL 路径不以斜杠开头。

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

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


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

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

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

    【讨论】:

    • 很好的解释,我在谷歌上找不到,谢谢。我可以在您的解决方案中使用通配符而不是 [23] 吗?然后,我将来可以将其应用于其他类似案例。将一个“。”在这里工作?
    • 您可以使用.(点)来匹配任何字符。尽管这对于您的目的来说太笼统了。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2015-11-04
    • 2018-10-03
    相关资源
    最近更新 更多