サイトから2つのセクションを削除しています。301すべてのサブディレクトリURLを404にリダイレクトし、クリーンなクエリ文字列
/倉庫/
/衣類/
私は、アイテムが削除されたと言ってシングル(404)ランディングページにこれら二つの下にすべてのURLを送りたいです。可能であれば、クエリ文字列もクリーンアップしたいと思います。
どこから始めますか?
サイトから2つのセクションを削除しています。301すべてのサブディレクトリURLを404にリダイレクトし、クリーンなクエリ文字列
/倉庫/
/衣類/
私は、アイテムが削除されたと言ってシングル(404)ランディングページにこれら二つの下にすべてのURLを送りたいです。可能であれば、クエリ文字列もクリーンアップしたいと思います。
どこから始めますか?
まず、リソースが存在したことを確認するために、404ではなく410(リダイレクト)をリダイレクトすることをお勧めします。
Apacheでは、次のようなことを行います。詳細については、thisページを参照してください。
RedirectMatch permanent "^/(warehouse|clothing)/?.*" "http://www.example.com/404"
IISでは、Web設定は次のようになります。 IISはクエリ文字列としてそれを解釈するので、正規表現で疑問符を使用することはできません。詳細については、thisページを参照してください。 drdaemanさんのコメントに基づいて、正規表現の先頭に^/
を含むように更新
<?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>
。
IISについてはわかりませんが、ApacheはPCREを使用していると思います。角括弧。また、先行する '^ /'が存在しなければなりません。https://httpd.apache.org/docs/2.4/mod/core.html#locationmatchを参照してください(引用:「URL **が*単に '**/extra/data'を含んでいるのではなく、' '/ extra/data''に正規表現の前に'^'を付ける必要があります)")(これは 'LocationMatch'に関する文書です。 IIRCでは 'AliasMatch'と' RedirectMatch'にも同じ原則が適用されます) – drdaeman
nginxを使用している場合は、location
sectionsのペアを追加することができます。特定の場所がない限り、一致します。詳細については、ドキュメントを参照してください。
location /warehouse/ {
return 410;
}
location /clothing/ {
return 410;
}
あまりにも多くの場所がある場合は、このように正規表現を使用することができますので、それらを個別に列挙する面倒なことができます:あなたがカスタマイズされた410ページにしたい場合は、このような構成を追加
location ~* ^/(warehouse|clothing|something-else)/ {
return 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を使用してください。この方法では、往復回数が少なくなります。
// I'm not sure `.*$` part is even necessary. Can be probably omitted.
RedirectMatch gone "^/(warehouse|clothing)/.*$" "/410.html"
または私はもう少し柔軟なオプションとしてmod_rewriteを使用することをお勧めしたい:あなたは、Apacheでこれを実行したい場合は
、あなたはRedirectMatch
でそれを行うことができます。ここ
RewriteEngine on
RewriteRule ^/(warehouse|clothing)/ - [G,L]
ErrorDocument 410 /410.html
[G]
は「行った」(410状態コード)を意味する。あなたは404応答をしたい場合は、do this instead:あなたはそのパスを示すために、あなたの正規表現で^/
を必要とすること
RewriteEngine on
RewriteRule ^/(warehouse|clothing)/ - [R=404,L]
注意だけでなく、は/warehouse/
または/clothing/
が含まれていますがものと開始します。さもなければ、/about/clothing/
のようなアドレスに誤って間違った回答が表示されます。私はあなたが後に.*$
を必要とするかどうかは確かではありませんが、私はあなたが信じていないと信じています。これをテストするためのApacheはありません。ルールが機能しない場合は、追加してください(例:^/(warehouse|clothing)/.*$
)。
あなたのアプリケーションでロジックを処理することができます。これは、基本レイアウトにユーザ依存のものが含まれていて、一貫性が必要な場合に唯一の方法です。どの言語/フレームワーク/スタックを使用しているのかわからなくても、答えは書けません。
サンプル文字列に対して正規表現をテストする場合は、[regex101](https://regex101.com/) – quackenator
Apache/nginx/IISですか?またはコードで?新しいターゲットにリダイレクトしたいのですか、またはURLをそのままにしたいのですが、特定のメッセージで404への応答を変更するだけですか? – Doqnach
Apacheはnginxで動作しています。うーん - URLをそのままにしておいて、検索エンジンを扱うのに404の音に反応を変えてください。 –