投稿日:2002年06月20日 作成鷹の巣

No.3788 apacheの個人用ディレクトリに/なしでアクセスできない



apacheの個人用ディレクトリに/なしでアクセスできない

No.3788 投稿時間:2002年06月20日(Thu) 23:33 投稿者名:rara URL:

最近apacheを用いて自宅サーバーをたてたraraです。このページは大変参考になりました。
apacheサーバーの設定に関する質問です。

apacheのユーザーディレクトリ機能を用いて
友人のホームページ用に個人用コンテンツディレクトリを作成しました。
ところが
http://hogehoge/~taro/
ではアクセスできるのですが
http://hogehoge/~taro
でのアクセスができません。
これはapacheの仕様なのでしょうか。それとも設定がまずいのでしょうか。
(トップページは http://hogehoge でアクセスできます。)


私も以前から不思議でした

No.3806 投稿時間:2002年06月21日(Fri) 13:53 投稿者名:OAK URL:

> http://hogehoge/~taro/
> ではアクセスできるのですが
> http://hogehoge/~taro
> でのアクセスができません。

私も以前から不思議でした。ほって置きましたがせっかくだからこの際調べてみました。
アパッチのマニュアルをはじからめくって見ましたがわからず。
ディレクトリにリンクを使っていたのでこれかなと思いはずしてみましたがNG
http.conf をいじっても見ましたがまったく出来ません。
仕方ないので他のそれで動いているサーバーをさがし、モニターしてみましたところ。
わかりました。
エラーになるのです。そのエラーを検出して、他のサイト(XXX/~users/) に転送をかけているのです。
これがわかればどって事無いですね。それを作ってやれば良い訳で。
今夜ひまがあったら作ってみます。


エラー処理用CGIプログラムです。

No.3810 投稿時間:2002年06月21日(Fri) 18:44 投稿者名:OAK URL:

私の場合は出来ましたが、そのまま違うOS、アパッチのバージョン等で動く保証は有りません。

まず、エラーの番号をログ等から探します。(私の場合301でした)
そのエラーが起きたら、CGIを呼ぶように設定します。

以下CGIプログラムです。'REQUEST_URI'と言うマニュアルで見かけない環境変数を使っているので、
ここが一番互換性に問題ありと思えます。

#!/usr/bin/perl
#
# http:/... /xxx など最後が / で無い時に / を付ける
#
$req=$ENV{'REQUEST_URI'};
$ck= rindex($req , '/');
if( $ck == (length($req)-1)) {exit(0);} # already last eq '/'
#
# 再度 URL を呼び出す
#
$url='http://' . $ENV{'HTTP_HOST'} . $req . '/';
print 'Location: '.$url . "\n";
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">' . "\n";
print '<HTML><HEAD>' . "\n";
print '<TITLE>301 Moved Permanently</TITLE>' . "\n";
print '</HEAD><BODY>' ."\n";
print '<H1>Moved Permanently</H1>' . "\n";
print 'The document has moved <A HREF="' .$url . '">here</A>.<P>'. "\n";
print '</BODY></HTML>';
print "\n";
exit(0);


エラーが起きたら、CGIを呼ぶように設定方法は?

No.3816 投稿時間:2002年06月22日(Sat) 02:08 投稿者名:rara URL:

OAKさんレスありがとうございました。
現在CGIを用いるか検討中です。

>そのエラーが起きたら、CGIを呼ぶように設定します。

この設定はどのように行うのでしょうか。

よろしくお願いします。


最近のバージョンは平気でした。

No.3820 投稿時間:2002年06月22日(Sat) 07:03 投稿者名:OAK URL:

昨日作ったプログラムを別の機械(先週インストールしたTURBO7サーバ)でやろうとしたところ、
そんなことしなくても動作していました。

先に最新でテストするべきでしたね。 前に書いたものは参考程度にしておいて下さい。


モジュールで対応できると思います。

No.3817 投稿時間:2002年06月22日(Sat) 03:34 投稿者名:帯鯖 URL:

帯鯖@名古屋です。

> http://hogehoge/~taro/
> ではアクセスできるのですが
> http://hogehoge/~taro
> でのアクセスができません。
> これはapacheの仕様なのでしょうか。それとも設定がまずいのでしょうか。

大抵のバージョンの Apache は、http://hogehoge/~taro でもアクセスは通るはずですが…
(Linux の Apache 1.3.19 と 1.3.22 で確認しています。)

httpd.conf において、mod_dir というモジュールを用意して、組み込む必要があります。
[設定例 httpd.conf]
LoadModule dir_module modules/mod_dir.so

大抵のバージョンは、デフォルトで既に組み込まれています。

しかし、LAN内のプライベートIPでサーバを構築している場合には注意が必要です。
LAN内からhttp://hogehoge/~taro で見れなくても、
LAN外部からは、きちんと見れている可能性が大きいです。

httpd.conf 内に記したドメインが邪魔しているのかもしれません。
もしそうだとすると、BIND の設定が必要です。

BIND 8.x 系ならば、
LAN内から $ nslookup hogehoge -> プライベートIPを返す
LAN外から $ nslookup hogehoge -> グローバルIPを返す
というように、ダブルで起動させてやる必要があります。

BIND 9.x 系ならば、機能として用意されているようなので調べてみてください。


ひとつ考えてみてください。
http://hogehoge/~taro で要求がきた場合、Apache はまずその階層において、ファイルを探します。
ファイル名がなく、かつ同名のディレクトリを発見した場合、Apache は要求の後に「/」をつけてhttp://hogehoge/~taro/ を返すわけです。

結果として、処理が多くなり、見る側に時間ロスを与えることになります。
最近は「/」を付けないアドレスが流行っていますが、考えてみると「便利な機能」である反面、「余分な機能」であったりします。
「/」をつけない特別な理由があれば別ですが。


一度、外部からの確認も行って頂くことをお勧めします。


上記事の追加

No.3818 投稿時間:2002年06月22日(Sat) 03:59 投稿者名:帯鯖 URL:

> http://hogehoge/~taro で要求がきた場合、Apache はまずその階層において、ファイルを探します。
> ファイル名がなく、かつ同名のディレクトリを発見した場合、Apache は要求の後に「/」をつけてhttp://hogehoge/~taro/ を返すわけです。
>
> 結果として、処理が多くなり、見る側に時間ロスを与えることになります。

サーバのログを探ってみたところ、最大で3秒のロスがありました。
回線やマシンの環境によるかもしれませんが、3秒は決して短くないと思います。


LAN用の正引きだけのDNSを立てることで回避しました。

No.3827 投稿時間:2002年06月22日(Sat) 11:05 投稿者名:ハル URL:

たまたま私もちょい前に嵌りました。

> 大抵のバージョンは、デフォルトで既に組み込まれています。

そうなんですよねぇ 私も同じ現象で悩んでhttpd.confを
長い時間眺めてみたりしました。 (笑)

> しかし、LAN内のプライベートIPでサーバを構築している場合には注意が必要です。
> LAN内からhttp://hogehoge/~taro で見れなくても、
> LAN外部からは、きちんと見れている可能性が大きいです。

私の場合は、これでした。

> BIND 8.x 系ならば、
> LAN内から $ nslookup hogehoge -> プライベートIPを返す
> LAN外から $ nslookup hogehoge -> グローバルIPを返す
> というように、ダブルで起動させてやる必要があります。

結局LAN用の正引きだけのDNSを立てることで回避しました。。
(これって邪道ですかね? (^^ゞ)


|目次|掲示板|過去ログ目次|▲頁先頭|