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

.htaccessに関して教えてください。

A.htmlというページが存在している場合は、B.htmlというページにアクセスがあった場合、
A.htmlに自動ジャンプし、もしA.htmlというページが存在していない場合は、そのまま
B.htmlを表示したいのです。

下記のような記述をしましたが、「このウェブページにはリダイレクト ループが含まれています」となり、表示されません。

お助けください!


Redirect B.html A.html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ B.html$1 [R=301,L,QSA]

以上、よろしくお願いします。

●質問者: harryqueeny
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど

「a.htmlファイルが存在するという条件のもとで、
リクエストがb.htmlだったならばa.htmlに飛ばす。」という思考でやってみてくださいな。
(下記はイメージです。実際には動かしてません。)

RewriteEngine on
RewriteCond a.html -f
RewriteRule ^b.html$ a.html [R=301,L,QSA]

うぃんどさんのコメント
>b.htmlが長く並んだURLに変化 a.htmlやb.htmlといった静的ファイルではなく、 phpなどで動的に対処しているのではないですか? もしそうであれば、それに合わせた対応となり、 環境説明や、手直しする前のhtaccessの中身などの情報が必要となります。

rouge_2008さんのコメント
RewriteCondの-fを大文字にすると動作しないでしょうか? 参照URL忘れました・・・ http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond >> - '<span style="font-weight:bold;">-F</span>' (is existing file, via subrequest) Checks whether or not TestString is a valid file, accessible via all the server's currently-configured access controls for that path. This uses an internal subrequest to do the check, so use it with care - it can impact your server's performance! -'<span style="font-weight:bold;">-U</span>' (is existing URL, via subrequest) Checks whether or not TestString is a valid URL, accessible via all the server's currently-configured access controls for that path. This uses an internal subrequest to do the check, so use it with care - it can impact your server's performance! <span style="font-weight:bold;">Note:</span> All of these tests can also be prefixed by an exclamation mark ('!') to negate their meaning. <<

harryqueenyさんのコメント
ありがとうございます。 特に、動的なものは組み込んでおらず、静的なhtmlファイルのみの構造なのですが、 うまく動作しません・・・。 a.html。b.htmlとも存在状態でもジャンプせず、、、という状態です。 お手数おかけして、すみません。。。

rouge_2008さんのコメント
ディレクトリ構造はどうなっていて、.htaccessはどこに設置してあるのでしょう? >|| RewriteEngine On RewriteCond a.html -F RewriteRule ^b.html$ a.html [R=301,L,QSA] ||< 上記は、ドキュメントルートに.htaccessを設置していて、同じ階層にa.html、b.htmlがある場合です。 a.htmlが、.htaccessやb.htmlとは違う階層にあるのでしたら、階層まで含めて指定してみてください。 >|| RewriteEngine On RewriteCond dir1\/dir2\/a.html -F RewriteRule ^b.html$ dir1/dir2/a.html [R=301,L,QSA] ||< ※上記のように.htaccessからの相対パスで指定するか、絶対パス(※WEBのドキュメントルートからのパスではありません。)で指定します。 ※リダイレクト先は、.htaccessからの相対パスか、WEBのドキュメントルートからのパスで指定します。 > a.html自体を直接見にいくと、URLがループしているようでb.htmlが長く並んだURLに変化し閲覧もできませんでした。 こちらの動作も気になるのですが、.htaccessには上記の他に何も記述しないでください。 もし必要な場合は、行頭に#を記述して一旦無効にしておいてください。 他の記述を無効にしても動作しない場合は、.htaccessの記述をすべて無効にして、a.htmlにアクセスして表示されるか確認してみてください。

harryqueenyさんのコメント
ご親切、誠にありがとうございます。 勉強になります。 無限ループのような状態から抜け出せない状態でしたので、 いろいろ調べて試してみたのですが、 RewriteCond %{REQUEST_URI} !^b.html という記述を付け足したら、動作できたような感じです。 ご教授ありがとうございました。

rouge_2008さんのコメント
>|| RewriteCond %{REQUEST_URI} !^b.html ||< 上記のルールの条件を追加すると、ホスト名を除くリクエストされたURLが指定したパターンで始まらない場合、リライトルールに該当するか確認し、該当した場合に実行されますが、指定したパターンで始まる場合は、リライトルールの確認を行わないので実行もされません。 ※「REQUEST_URI」は「/」から始まりますので、「RewriteCond %{REQUEST_URI} !^/b.html」のように記述しないと、どのURLにアクセスしても何も変化はない(※記述しなかった場合と同じ)はずですが、スラッシュ「/」がないのは記述ミスでしょうか? 「RewriteCond %{REQUEST_URI} !^/b.html」とスラッシュがある場合、「http://サイトのドメイン/b.html」へのアクセス時はリライトルールの確認・実行が行われません。 上記以外のアドレスへのアクセス時にリライトルールの確認・実行が行われますが、以下のリライトルールには該当しませんので、b.htmlへアクセスしてもa.htmlへのリダイレクトは実行されません。 >|| RewriteRule ^b.html$ a.html [R=301,L,QSA] ||< どのリライトルールに対して「RewriteCond %{REQUEST_URI} !^/b.html」を指定したのでしょうか? 良かったら動作環境・状態をもう少し詳しく教えてください。 【※追記して再投稿※】 ブラウザを再起動するか、キャッシュを削除しませんでしたか? 「RewriteCond %{REQUEST_URI} !^b.html」がなくても動作すると思いますので、この行を削除するか無効にし、ブラウザのキャッシュを削除してから再度動作を確認してみてください。 ※また少しだけ訂正しました。ほんの少しの違いですが・・・ 何回もメールが届いていたらすみません。

質問者から

ありがとうございます。

アドバイスいただいた内容で試してみましたが、うまくいきませんでした。

a.html自体を直接見にいくと、URLがループしているようでb.htmlが長く並んだURLに変化し閲覧もできませんでした。

もし対策がお分かりになるようでしたらご教授くださいませ。

よろしくお願いします。


関連質問

●質問をもっと探す●



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