web-dev-qa-db-ja.com

ルールモジュールを使用して古いURLのカスタムリダイレクトを実装する方法

以前は Views モジュールを介してカタログのコンテンツを表示し、外部データベースにアクセスして、すべてのURLが/ content?name = [name]のようになるようにしていました。

さまざまな理由から、コンテンツをDrupalに一意のコンテンツタイプとして直接インポートすることを選択しました。したがって、私のURLは/ content/[name]になります。

301リダイレクトを実装して、最初のURLにアクセスするユーザーが(古いブックマーク、リンクなどにより)新しいURLに移動するようにする必要があります。

これを実現するコンテンツタイプのルールを設定することは可能ですか? [name]フィールドは同じなので、設定するのはかなり簡単なことのように思えます。

いくつか検索して、RewriteRule ^/?content/([^/d]+)/?$ content?name=$1 [L,QSA]を思いつきました。 _RewriteEngine on_の後に.htaccessファイルに入れてみましたが、うまくいきませんでした。適切な.htaccess規約に従っていますか?私もRewriteRule ^(.*)/content?name=(.*)$ $1/content/$2 [R,L]を試しましたが、うまくいきませんでした。

6
astrosa

.htaccessの使用がオプションにならない理由

.htaccessファイルでリダイレクトを設定できない場合があります。

  • .htaccessファイルへの編集アクセスは許可されていません(=「持っていません」)。
  • プロバイダーは 。htaccessファイルの特定のディレクティブ (使用したい)を許可しません。
  • DrupalサイトはIISで実行されています。
  • .htaccessにリダイレクトを正しくコーディングするために必要な知識がありません。
  • ... (ほかに何か?)。

以下でさらに詳しく説明するように、これらはすべて Rules モジュールに基づくアプローチを使用する理由です。

「Drupalが初期化中」のルールを使用する

これを機能させるために Rules モジュールを使用すると、「Drupal is initializing」イベントを使用できるはずです。これにより、実際のコンテンツが表示される前にルールがトリガーされます。

正規表現を使用する

「インターセプト」するリンクは、何らかのタイプの正規表現でフォーマットする必要があります。これをルール「条件」として使用します。 「特定のパスに一致する何かの実際のコンテンツを表示する前に...」に対応するルールがあるようにします。その部分が機能するようになったら、ルールの「アクション」で、実行する実際のリダイレクトを指定する必要があります。

備考:この場合、「contains /content?name=」を(正規表現の代わりに)使用して、テキスト一致を機能させることもできます。

ルールの例

node/12を介したノードへのアクセスを制限し、content/sometitleのようなパスを介したアクセスを許可する方法 」に関する質問への私の回答の「オプション1」の部分を参照してください。エクスポート形式のルール:

{ "rules_check_url" : {
    "LABEL" : "Disallow node/* access",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "init" : [] },
    "IF" : [
      { "text_matches" : {
          "text" : [ "site:current-page:url" ],
          "match" : "node\/\\d+$",
          "operation" : "regex"
        }
      }
    ],
    "DO" : [
      { "drupal_message" : {
          "message" : "Sorry, URLs like [site:current-page:url] are not allowed around here ...",
          "type" : "error"
        }
      },
      { "redirect" : { "url" : "no_access" } }
    ]
  }
}

以下は、上記のサンプルのいくつかの推奨されるチューニングであり、あなたのケースでも機能するようにしています:

  • マシン名とラベル。
  • node/*をパス(「ラベル」内の正規表現)に置き換えます。
  • ルールのアクション部分のパスをターゲットパス(詳細は下記)に置き換え、ある種のエラーメッセージを表示するかどうかを確認します(アクションのその部分を削除しない場合)。

リダイレクトで[name]変数の値を使用する

URL引数の値をルールの新しい変数として利用できるようにするには、 Rules URL Argument モジュールを使用できます。これについての引用は次のとおりです(プロジェクトページから)。

...は、URL引数に基づいて2つのルール条件を提供します。

  • uRL引数が存在するかどうかを確認します。
  • uRL引数の値を比較します。

また、URL引数の値をルールの新しい変数として使用できるようにするアクションも提供します。

新しく提供されたルールのアクションと条件は、ルール構成インターフェースの「URL引数」条件とアクショングループにあります。

使用方法の例については、参照してください 問題#1686360のコメント# これは約URLに量を渡す、つまり、site/content/node -title?amount = 10または/ node-title?= amount:10 "。その関連部分は次のとおりです。

  • ルールに「URL引数が存在するかどうかを確認する」条件を追加し、「ARGUMENT」値を「amount」に設定します。
  • ルールに「URL引数値を提供する」アクションを追加し、「URL引数名」の値を「量」に設定し、「提供された変数」セクションで「URLからの引数-変数名」を次のように設定します。 「amount_from_url」。

これで、このルールの他のアクションの変数「amount-from-url」として金額の値を使用できるようになります。

[〜#〜] ps [〜#〜]Rules に慣れていない(まだ/まだ)場合、32(!!!)のすばらしい無料のビデオチュートリアル ルールフレームワークを学ぶ をチェックアウトしてください。

12
Pierre.Vriens

301リダイレクトの場合、 Global Redirect モジュールを確認することをお勧めします。それのいくつかの詳細(プロジェクトページから):

GlobalRedirectはシンプルなモジュールで…

  • エイリアスの現在のURLを確認し、使用されていない場合は301リダイレクトを行います。
  • 末尾のスラッシュがないか現在のURLをチェックし、存在する場合は削除し、新しいリクエストでチェック1を繰り返します。
  • 現在のURLがsite_frontpageと同じかどうかを確認し、一致する場合はフロントページにリダイレクトします。
  • URLのクリーンアップ機能が有効になっているかどうかを確認し、現在のURLが 'unclean'メソッドではなくcleanメソッドを使用してアクセスされていることを確認します。
  • URLへのアクセスをチェックします。ユーザーがパスにアクセスできない場合、リダイレクトは行われません。これにより、エイリアスされたプライベートノードの公開を回避できます。
  • アクセスされるURLの大文字と小文字が、作成者/管理者によって設定されたものと同じであることを確認してください。たとえば、エイリアス「articles/cake-making」をnode/123に設定した場合、ユーザーは大文字と小文字を組み合わせてエイリアスにアクセスできます。
  • 上記のオプションのほとんどは、設定ページで構成できます。 Drupal 5では、globalredirect_adminモジュールを有効にした後でこれにアクセスできます。Drupal 6では、設定ページがモジュールにバンドルされています。
2
Leolando Tan