人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ソフト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>


●質問者: でりみた
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● gizmo5
●1000ポイント ベストアンサー

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

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

でりみたさんのコメント
実サイトとhtaccess testerでチェックしてみましたが効かないようです。

gizmo5さんのコメント
htaccess tester は何を使ったのか教えてください。 以下のところは駄目です。REQUEST_URI に対応していません。 http://htaccess.madewithlove.be/ 実サイトでまさか RewriteEngine On を書いていないということはないと思いますが、他に RewriteCond や RewriteRule を記述していませんか。 私が回答したものだけを試すとどうなりますか。 以下は、? が末尾につくパターンだけ対応できないものです。 これを試すとどうなりますか。 >|| RewriteCond %{QUERY_STRING} . RewriteRule ^ - [R=404,L] ||<

でりみたさんのコメント
ありがとうございます。 テスターはそのサイトになります。 そして、実際のサイトで試したものですが以下内容になります。 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} \? RewriteRule ^ - [R=404,L] </IfModule> いままで404が出せていたパラメーターのパターンも200で通るようになってしまいましたね。

でりみたさんのコメント
新しくいただいたもので試したところ、仰られる通り以下のパターンだけが200で通るようになり、他のパターンは404にすることができました。ありがとうございます。 http://example.com/? このパターンはREQUEST_URIでは取りきれないでしょうか?

gizmo5さんのコメント
申し訳ありません。 記憶では REQUEST_URI はボスト名以降が全て入っていたと思ったのですが、どうやら ? で分割されているようです。 分割されていると、 ? だけ入っている場合とついていない場合の区別がつけられません。 質問では「この2ページしかありません」とありますが、休眠しているサイトか何かなのでしょうか。 404を返さないパターンが少ないのであれば、通すものを RewriteCond の否定ではじいた方が良いかもしれません。

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] ||<

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

2 ● kitiko
●0ポイント

設定によっては.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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ