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



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

/仓库//服装/

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

我从哪里开始?

如果你使用的是nginx,你可以添加一对location部分。只要没有更具体的位置,它们就会匹配。有关更多详细信息,请查看文档。

location /warehouse/ {
return 410;
}
location /clothing/ {
return 410;
}

如果位置太多,单独列出它们可能会很麻烦,因此您可以使用如下所示的正则表达式:

location ~* ^/(warehouse|clothing|something-else)/ {
return 410;
}

如果您想要自定义的 410 页面,请在server块中添加如下配置:

error_page 410 /410.html;
location = /410.html {
root /var/www/error/;    # Put a file /var/www/error/410.html
internal;
}

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

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

如果你想在 Apache 中做到这一点,你可以使用RedirectMatch

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

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

RewriteEngine on
RewriteRule ^/(warehouse|clothing)/ - [G,L]
ErrorDocument 410 /410.html

这里的[G]表示"消失"(410状态代码)。如果需要 404 响应,请改为执行以下操作:

RewriteEngine on
RewriteRule ^/(warehouse|clothing)/ - [R=404,L]

请注意,您需要在正则表达式中^/以指示路径不仅包含/warehouse//clothing/,而且以这些开头。否则,您将在诸如/about/clothing/之类的地址上看到可疑的错误响应。我不确定你是否需要尾随.*$,但我相信你不需要。不要让 Apache 来测试这一点。如果规则不适合您,请添加它(即^/(warehouse|clothing)/.*$)。

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

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

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

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

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

<?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 的评论更新为包含正则表达式开头的^/

最新更新