web-dev-qa-db-ja.com

mod_rewrite:URLからクエリ文字列を削除しますか?

.htaccessを使用して次のリダイレクト(301)を作成しようとしています

*?page = 1は*にリダイレクトします

(*はワイルドカードです)。

基本的に、URLの最後に?page = 1が付いているページにアクセスする人を禁止し、代わりに同じURLから?page=1

これを行う簡単な方法はありますか?

28
Freddy

これはそれを行う必要があります:

RewriteEngine    On
RewriteCond      %{QUERY_STRING}    ^page=1$
RewriteRule      (.*)               $1?     [R=permanent]

1行ずつ:

  1. 書き換え機能を有効にします。
  2. 次のルールを適用するには、クエリ文字列がpage=1でなければならないことを条件( "ifステートメント")として指定します。
  3. 次に、パス全体(。*)をそれ自体($ 1)に置き換えるというルールを指定しますが、クエリ文字列を空(?)にし、結果を永続的なリダイレクト(301)にします。

リダイレクトを一時的(302)にする場合は、=permanent部分を削除するだけです。 Rフラグのデフォルトは、Moved Temporarilyです。

42

QSDフラグ(クエリ文字列破棄)を使用して、クエリ文字列を渡さずにどこかにリダイレクトすることもできます。

21
Didier Sampaolo

Apache 2.4を使用している場合、QSD(クエリ文字列破棄フラグ)を使用して、リンク先URLから特定のクエリ文字列を破棄できます。

Apache 2.4ユーザーの例を次に示します。

古いURL:-/ foo/bar /?page = 1

新しいURL:-/ foo/bar /

Htaccessコード:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI} [L,R,QSD]

上記のルールは、クエリ文字列を削除するために?page = 1でURIをリダイレクトします。この例は、QSDをサポートしていないため、Apacheバージョン2.4以下で500エラーを返します。

Apacheの下位バージョンでは、宛先URLの末尾に空の疑問符を使用して、クエリ文字列を削除できます。

例 :

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI}? [L,R]

上記の例は、Apacheのほとんどすべてのバージョンで機能します。

(お役に立てれば!)

8
starkeen

クエリ文字列全体を削除するには、これで十分です。

RewriteRule ^(.*) http://domain.com/$1? [R=301,L]
4