ソフト404を解消するためのhtaccessを教えていただけないでしょうか?

Googleに存在しないクエリーの付いたurlがクロールされて困っております。存在しないurlについては404を返したいと思います。

サイトは以下の2ページが存在します。
http://example.com
http://example.com/index.html(上のパターンにリダイレクトでも可)
http://example.com/hoge.html

今回404を返したいurlパターンです。
http://example.com/?
http://example.com/?foo
http://example.com/?foo=bar
http://example.com/?foo=bar&foo1=bar1&(この後もいろいろ続く)
http://example.com/?&foo
hoge.htmlの場合
http://example.com/hoge.html?
http://example.com/hoge.html?foo
http://example.com/hoge.html?foo=bar
http://example.com/hoge.html?foo=bar&foo1=bar1&(この後もいろいろ続く)
http://example.com/hoge.html?&foo

自分でも設定してみたのですが、いくつか404が出せず困っております。
上記のパターンで404が返せる具体的なhtaccessを教えていただけないでしょうか?

自分で設定したhtaccessも置いておきます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^.*=
RewriteRule ^$ /? [R=404,L]
</IfModule>

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2015/06/12 10:39:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141

ポイント1000pt

とにかく URL 中に? が含まれていたら 404 を返すには以下のようにやります。

RewriteCond %{REQUEST_URI} \?
RewriteRule ^ - [R=404,L]
他5件のコメントを見る
id:gizmo5

マニュアルを確認しました。
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

THE_REQUEST 変数が利用できるかもしれません。

RewriteCond %{THE_REQUEST} \?
RewriteRule ^ - [R=404,L]

先のコメントのように受け付けるホワイトリストを定義する場合にはこのような形式になると思います。

RewriteCond %{THE_REQUEST} !/$
RewriteCond %{THE_REQUEST} !^/index\.html$
RewriteCond %{THE_REQUEST} !^/hoge\.html$
RewriteRule ^ - [R=404,L]

HTML ファイルを正規表現で書いても同様です。

RewriteCond %{THE_REQUEST} !/$
RewriteCond %{THE_REQUEST} !\.html$
RewriteRule ^ - [R=404,L]
2015/06/11 22:36:12
id:delimiter

THE_REQUESTというのもあったのですね。マニュアル確認大切ですね。
THE_REQUESTのパターンでほぼ期待通りの動きが実現できました。
頂いた内容を元に改めて理解できるよう勉強してみたいと思います。

2015/06/12 10:35:08

その他の回答1件)

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141ここでベストアンサー

ポイント1000pt

とにかく URL 中に? が含まれていたら 404 を返すには以下のようにやります。

RewriteCond %{REQUEST_URI} \?
RewriteRule ^ - [R=404,L]
他5件のコメントを見る
id:gizmo5

マニュアルを確認しました。
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

THE_REQUEST 変数が利用できるかもしれません。

RewriteCond %{THE_REQUEST} \?
RewriteRule ^ - [R=404,L]

先のコメントのように受け付けるホワイトリストを定義する場合にはこのような形式になると思います。

RewriteCond %{THE_REQUEST} !/$
RewriteCond %{THE_REQUEST} !^/index\.html$
RewriteCond %{THE_REQUEST} !^/hoge\.html$
RewriteRule ^ - [R=404,L]

HTML ファイルを正規表現で書いても同様です。

RewriteCond %{THE_REQUEST} !/$
RewriteCond %{THE_REQUEST} !\.html$
RewriteRule ^ - [R=404,L]
2015/06/11 22:36:12
id:delimiter

THE_REQUESTというのもあったのですね。マニュアル確認大切ですね。
THE_REQUESTのパターンでほぼ期待通りの動きが実現できました。
頂いた内容を元に改めて理解できるよう勉強してみたいと思います。

2015/06/12 10:35:08
id:kitiko No.2

回答回数470ベストアンサー獲得回数42

設定によっては.htacessの更新が必要です。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

http://www.cquery.net/modrewrite_parmlink_404.html

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません