我们正在从我们的网站中删除两个部分。
/仓库/
/服装/
我想将这两个下面的所有网址发送到一个(404)目标网页,说明该项目已被删除。如果可能的话,我也想清理查询字符串。
我从哪里开始?
答案 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来测试这个。如果规则不适合您,请添加它(即.*$
)。
或者您可以处理应用程序中的逻辑 - 如果您的基本布局包含依赖于用户的内容并且您希望保持一致性,那么这可能是唯一的方法。如果不知道你使用什么语言/框架/堆栈,就无法编写答案。