2017-05-12 10 views
-1

サイトから2つのセクションを削除しています。301すべてのサブディレクトリURLを404にリダイレクトし、クリーンなクエリ文字列

/倉庫/
/衣類/

私は、アイテムが削除されたと言ってシングル(404)ランディングページにこれら二つの下にすべてのURLを送りたいです。可能であれば、クエリ文字列もクリーンアップしたいと思います。

どこから始めますか?

+0

サンプル文字列に対して正規表現をテストする場合は、[regex101](https://regex101.com/) – quackenator

+1

Apache/nginx/IISですか?またはコードで?新しいターゲットにリダイレクトしたいのですか、またはURLをそのままにしたいのですが、特定のメッセージで404への応答を変更するだけですか? – Doqnach

+0

Apacheはnginxで動作しています。うーん - URLをそのままにしておいて、検索エンジンを扱うのに404の音に反応を変えてください。 –

答えて

1

まず、リソースが存在したことを確認するために、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> 

+0

IISについてはわかりませんが、ApacheはPCREを使用していると思います。角括弧。また、先行する '^ /'が存在しなければなりません。https://httpd.apache.org/docs/2.4/mod/core.html#locationmatchを参照してください(引用:「URL **が*単に '**/extra/data'を含んでいるのではなく、' '/ extra/data''に正規表現の前に'^'を付ける必要があります)")(これは 'LocationMatch'に関する文書です。 IIRCでは 'AliasMatch'と' RedirectMatch'にも同じ原則が適用されます) – drdaeman

1

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)/.*$)。

あなたのアプリケーションでロジックを処理することができます。これは、基本レイアウトにユーザ依存のものが含まれていて、一貫性が必要な場合に唯一の方法です。どの言語/フレームワーク/スタックを使用しているのかわからなくても、答えは書けません。

関連する問題