301将所有子目录URL重定向到404并清除查询字符串

时间:2017-05-12 13:33:22

标签: regex redirect

我们正在从我们的网站中删除两个部分。

/仓库/
/服装/

我想将这两个下面的所有网址发送到一个(404)目标网页,说明该项目已被删除。如果可能的话,我也想清理查询字符串。

我从哪里开始?

2 个答案:

答案 0 :(得分:1)

首先,我建议您重定向到410(Gone)而不是404,以确认该资源曾经存在过。

在Apache中,您可以执行以下操作。有关详细信息,请参阅this页面。

RedirectMatch permanent "^/(warehouse|clothing)/?.*" "http://www.example.com/404"

在IIS中,您的Web配置看起来如下所示。请注意,IIS不允许您在正则表达式中使用问号,因为它将其解释为查询字符串。有关详细信息,请参阅this页面。

<?xml version="1.0" encoding="UTF-8"?>
   <configuration>
    <system.webServer>
    <rewrite>
    <rules>
        <rule name="404 Redirect" stopProcessing="true">
                    <match url="^/(warehouse|clothing)/" />
            <action type="Redirect" url="404" appendQueryString="true" redirectType="Permanent" />
            <conditions trackAllCaptures="true"></conditions>
        </rule>
   </rules>
   </rewrite>
        <httpProtocol allowKeepAlive="false" />
        <caching enabled="false" />
        <urlCompression doDynamicCompression="true" />
  </system.webServer>
</configuration>

根据drdaeman的评论更新为在正则表达式开头包含^/

答案 1 :(得分:1)

如果您使用的是nginx,则只需添加一对location sections即可。只要没有更具体的位置,它们就会匹配。查看文档以获取更多详细信息。

$result = $bucket->upload($file, [
        'name' => $des,
        'metadata' => [ 'storageClass' => 'regional' ]
    ]);

如果位置太多,单独列出它们可能很麻烦,所以你可以像这样使用正则表达式:

location /warehouse/ {
    return 410;
}

location /clothing/ {
    return 410;
}

如果您想要自定义的410页,请在location ~* ^/(warehouse|clothing|something-else)/ { return 410; } 块中添加如下配置:

server

如果要返回该状态代码,请将410替换为404。我相信410“Gone”是更合适的答案,但是YMMV。

我建议在离客户端更近的地方做这个,所以如果nginx在Apache前面 - 用nginx做。这样你的往返次数就会减少。

如果您想在Apache中执行此操作,可以使用RedirectMatch

执行此操作
error_page 410 /410.html;
location = /410.html {
    root /var/www/error/;    # Put a file /var/www/error/410.html
    internal;
}

或者我建议使用mod_rewrite作为更灵活的选项:

// I'm not sure `.*$` part is even necessary. Can be probably omitted.
RedirectMatch gone "^/(warehouse|clothing)/.*$" "/410.html"

此处RewriteEngine on RewriteRule ^/(warehouse|clothing)/ - [G,L] ErrorDocument 410 /410.html 表示“已消失”(410状态代码)。如果您想要404回复,do this instead

[G]

请注意,您的正则表达式中需要RewriteEngine on RewriteRule ^/(warehouse|clothing)/ - [R=404,L] 来指示路径不仅包含 ^//warehouse/,而以那些。否则,您会在/clothing/等地址上看到错误的错误回复。我不确定你是否需要尾随/about/clothing/,但我相信你不会。没有Apache来测试这个。如果规则不适合您,请添加它(即.*$)。

或者您可以处理应用程序中的逻辑 - 如果您的基本布局包含依赖于用户的内容并且您希望保持一致性,那么这可能是唯一的方法。如果不知道你使用什么语言/框架/堆栈,就无法编写答案。