サーバ内でのリダイレクトで、わけわかんねぇ挙動

201 views
Skip to first unread message

davi

unread,
Mar 18, 2013, 4:28:18 PM3/18/13
to TSNET
みなさん < こん??は でび です

LOGから見ると、IE側のバグとも考えづらいのでは、と思うのですが、
サーバ屋さんの"httpd.conf"の設定ミスと見て良いんでしょうかね?

ちと不安なので、サーバ屋さんに問い合わせする前に、見て下さい。

なお、環境は、共有サーバで、"httpd.conf"ファイルをいじる権限はなし。
ユーザがいじれるのは".htaccess"ファイルだけです。
OSはCentOSだろうと思います(たぶん)。

サーバのドキュメントルートが「ア」となっていて、
「イ」へのアクセスを「ウ」にリダイレクトしたい、と。
んで、「エ」には「オ」と記述されている。

このとき、★部分に、「カ」だけを入れた場合でも、また、「キ」だけを
入れた場合でも、Firefoxではイにアクセスすると狙い通りに
「ウ」に飛んでくれる。

ところが、IE9だとサーバのドキュメントルートを指定したかのような
http://www.examle.com/usr/home/U-ID/html/CCC/DDD.html
というアドレス(としてブラウザでは見えるアドレス)に飛んでしまいます。

前提条件として、カやキのBBB.htmlというファイル名は
設置している静的コンテンツの中で一意に決まるファイル名です。

また、FirefoxでもIE9でもwww付加する部分のRewriteRuleは
U-ID部分が露出したりしないで、ちゃんと効いています。

そして、401~404エラー処理についてもFirefoxでもIE9でも
ちゃんと効いています。

ですので、記載を省略したHTTP_USER_AGENTの所でIE9だけが
引っかかるようなわけでもなさそうです。

さて、Firefoxでは正常にジャンプしますが、IEでアクセスした
場合はエラーになる。該当する部分をhttpd-error_logで見ると、

[Tue Mar 19 04:54:43 2013] [error] [client XXX.XXX.XXX.XXX] File does not exist: /usr/home/U-ID/html/usr/home/U-ID/html/CCC/DDD.html

と出ています。
これが実際にIE9がサーバに要求しているアドレスのようです。

どう見ても二段重ねの要求を出しているように見えます。
なんじゃこりゃ?

で、そんな所にファイルはないので、結果的にIE9では
404エラー用表示に作っておいた404.htmlが表示される
という次第です。

試した感じではRewriteBaseを無指定にしても関係ないみたいです。

6時間ほどがんばりましたが、降参です。
これ、どう対策したら良いでしょう?

ア:http://www.examle.com/usr/home/U-ID/html/
イ:http://www.examle.com/AAA/BBB.html
ウ:http://www.examle.com/CCC/DDD.html
エ:http://www.examle.com/.htaccess
オ:
------------------------------------------
RewriteBase /usr/home/U-ID/html
# RewriteBase /

# 以下、wwwなしでのアクセスを301エラーで永久リダイレクト
RewriteCond %{HTTP_HOST} ^(192\.168\.0\.1)(:80)? [NC,OR]
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)? [NC]
RewriteRule ^(.*) http://www\.example\.com/$1 [R=301,L]

#★

# AfriNICのIPv4ブロック3つを全て遮断
RewriteCond %{REMOTE_ADDR} ^41\.* [OR]
RewriteCond %{REMOTE_ADDR} ^196\.* [OR]
RewriteCond %{REMOTE_ADDR} ^197\.* [OR]

#(bot対策とか色々。大幅に中略)

RewriteCond %{HTTP_USER_AGENT} "^$" [OR]

#(bot対策とか色々。大幅に中略)

RewriteCond %{HTTP_REFERER} facebook\.com [NC]
RewriteRule ^.*$ http://www.google.com/ [R=301,L]

# パスワード認証に失敗した場合
ErrorDocument 401 /error/401.html

# アクセス規制に引っかかった場合
ErrorDocument 403 http://www.spam.com [R=301,L]

# 存在しないファイルの場合
ErrorDocument 404 /error/404.html

#(以下略)
<FilesMatch "^\.ht">
Satisfy all
Order Allow,Deny
Deny from all
</FilesMatch>

<FilesMatch "\.(ini\.php|lng\.php)$">
Order allow,deny
Deny from all
</FilesMatch>
------------------------------------------

カ:
------------------------------------------
RedirectMatch permanent ^(.*BBB\.html)$ http://www.examle.com/CCC/DDD.html
------------------------------------------

キ:
------------------------------------------
RewriteRule ^.*BBB\.html$ http://www.examle.com/CCC/DDD.html [R=301,L]
------------------------------------------

でび http://davi.txt-nifty.com/1984/

davi

unread,
Mar 19, 2013, 5:02:47 AM3/19/13
to tsnet_...@googlegroups.com
みなさん < こん??は でび です

補足です。

RewriteBaseの上には

Options +FollowSymLinks -Indexes
RewriteEngine On

が入っています。
どうやら、シンボリックリンクを許可してからでないと
Rewriteが効かないみたいなんです。

あと、examle.comexample.comのタイプミスでpが
抜けました。実際の環境では正しく記述してあります。

それと、AAAディレクトリそのものは、既に
削除してあるので、AAAディレクトリの中に
単独の.htaccessを入れるのはやりたくないです。
(実際にやってみても、同様のエラーでしたし。)

.htaccessは保存はS-JISでCRLF、ASCIIモードで転送し、
パーミッションは604にしてあります。
他の設定が動いているから、たぶんEUCでLFで送らない
でも良いみたいだと思っていますが。

でび http://davi.txt-nifty.com/1984/

Zazel

unread,
Mar 19, 2013, 8:30:21 PM3/19/13
to tsnet_...@googlegroups.com
Zazelです。

いろいろ誤解していると思われる部分がありますが、意図を汲み取って、

(2013/03/19 5:28), davi wrote:
> 「イ」へのアクセスを「ウ」にリダイレクトしたい、と。

ここがメインだとすれば、ドキュメントルートに置く.htaccessへの記述で
最低限必要なのは

RewriteEngine on
RewriteRule ^AAA/BBB\.html$ /CCC/DDD.html [R=301,L]

だけです。あとの記述は他の設定との絡みで決まるのでなんともいえません。

なお一番誤解していると思われるのはRewriteBaseで、FollowSymLinksがないと
動かないとのことなので、あえてRwwriteBaseを指定していることで不整合が
起こっていると思われます。理由は長くなるので、知りたければご自身で調べて
みてください。ポイントはRewriteBaseの適用条件とデフォルトの値です。

davi

unread,
Mar 19, 2013, 10:24:05 PM3/19/13
to tsnet_...@googlegroups.com
Zazelさん < こん??は でび です

On Wed, 20 Mar 2013 09:30:21 +0900
Zazel <zaz...@gmail.com> wrote:

> 最低限必要なのは
>
> RewriteEngine on
> RewriteRule ^AAA/BBB\.html$ /CCC/DDD.html [R=301,L]
>
> だけです。

ダメな組み合わせ記述として、

RewriteRule ^/AAA/BBB\.html$ /CCC/DDD.html [R=301,L]
RewriteRule ^/AAA/BBB\.html$ CCC/DDD.html [R=301,L]
RewriteRule ^AAA/BBB\.html$ CCC/DDD.html [R=301,L]

とかがあり得る、と。
この辺は、あれこれ試していた段階で挙動が異なるのに気づいて、
結構アレレでした。

> なお一番誤解していると思われるのはRewriteBaseで、FollowSymLinksがないと
> 動かないとのことなので、あえてRwwriteBaseを指定していることで不整合が
> 起こっていると思われます。

「あえて」やるのがまずかったのですね。

> ポイントはRewriteBaseの適用条件とデフォルトの値です。

調べてみました。
http://log.nissuk.info/2012/04/apache-rewritebase.html
後半部が親切でした。《》はメモとして私が追記した部分。

| RewriteBaseを指定《しなかった》場合の既定値は.htaccessを
| 置いたディレクトリの《物理パス》です。
| そしてRewriteBaseは《書き換え後の》相対パスの《ベース》です。

これに該当するようですね。

| 書き換え後のパスが《物理パス》だった場合RewriteRuleで
| パターンマッチして内部リダイレクトさせる《前》に
| 「strip document_root prefix」という形でドキュメントルート
| の《物理パスを取り除いている》ためです。

デフォルトで置き換えてくれる親切設計なんだよ、と。
それなのに、わざわざRewriteBaseを指定し直しちゃったから
おかしくなるんだよ。と。

| ただし外部リダイレクト(RewriteRuleにRフラグをつける)にすると
| 話は変わってきて

| ドキュメントルートの物理パスを取り除かずに外部リダイレクト
| するので結果として
(URLの中で物理パスを指定したような長大なアドレス、例えば)
| http://example.local/var/www/vhosts/example.local/abc/ghi.html
| アクセスしてしまいます。

ということで、余計なことしやがって、という挙動になった、と。

RewriteBaseは特に何か狙いがない限り、原則、OFFで運用だよ、と。
なるほど。

RewriteBaseの指定をコメントアウトして、

> RewriteRule ^AAA/BBB\.html$ /CCC/DDD.html [R=301,L]

で、IEでもちゃんと動くようになりました。

ありがとうございます。

でび http://davi.txt-nifty.com/1984/

Reply all
Reply to author
Forward
0 new messages