2018年03月30日


実運用では無く、学習用の WWWサーバーとしてはこれ以外に無い『AN HTTP Server』ですが、古いソフトなので使い方にコツがあります

大前提!! 管理者権限で起動する

これを守らないと、環境によっては訳が解らない事になります。
httpd.exe のプロパティの『互換性タブ』の一番下の特権レベルで、『管理者としてこのプログラムを実行する』ほうが間違い無いです。


▼ 以下は、ショットカットの場合の設定 ショートカットを作成して、その詳細設定ボタンから常に管理者権限で起動するようにしておきます。これは、AN HTTPD がレジストリを使ってデータを保存するので、通常起動だと情報が意図しない場所に保存されて読み出しできなくなるからです。
AN HTTP Server が何故か落ちる場合は、レジストリの AnHttpd(HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd) を全て削除して下さい。何らかのの理由で整合性が保たれなくなって落ちています。httpd.exe を実行するとデフォルトの正しいエントリが作成されます。そしてもちろんの事ですが、実行は管理者権限で実行してください。
Windows SDK の mt.exe を使って、exe ファイルそのものを変更して 管理者権限で実行させるようにする事もできます 以下は、実行中の httpd.exe を終了させ、管理者としてカレントの httpd.exe を実行して、スクリプトのあるフォルダをドキュメントルートにします。(インデックス表示を許可するようにしています)
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Dim Fs,WshShell

Set WshShell = CreateObject("WScript.Shell")

Const ForWriting = 2
Set Fs = CreateObject("Scripting.FileSystemObject")
strCurPath = WScript.ScriptFullName
Set obj = Fs.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

Call WshShell.Run( "cmd /c taskkill /im httpd.exe /f", , True )

Call WshShell.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd\default\DocumentRoot\",strCurPath )
Call WshShell.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd\default\Index\Browsable","Off" )
WshShell.Run(strCurPath & "\httpd.exe")

※ php.ini では、cgi.force_redirect = 0 を設定してください。

WEB アーカイブからダウンロードは可能です。

とにかく、今年( 2015年 )の2月5日以降に、何があったのか配布サイトのトップの HTML が無くなっています。ダウンロードリンクはまだ生きていますが、いつ無くなっても不思議は無いです(なくなりました)。



Apache を使ってもいいのですが、インストールいらずで 軽量なので、USB に気軽にいくつでも入るので便利この上無いです。( USB への使い方は、エイリアス無しでルートにディレクトリを掘って何パターンも保存できると言う意味です )

しかし、確かにいろいろ面倒な事が山積みではあるので、知らない人が使おうと思う事はまず無いと思います。ですが、以降の手順であればすぐに PHP を使っていろいろな事ができます。

"C:\httpd142p" に保存する

これは、後々小回りが利くという意味でもありますが、Program Files は、Windows の権限の扱いが面倒だと言う事と、フォルダ名にスペースが混じっているという問題があります。Cドライブに自分が必ず普通にアクセスできる権限で保存します。二つ欲しければ違う名前にします( 但し、一度に起動できるのは一つまでですし、切り替えるにはドキュメントルートの変更が必要です / レジストリは同じ場所になるので )

余計な機能は使わない

1) 引数を与えてレジストリ内に複数環境を作成する事ができる
2) サービスとして登録できる

この二つの機能は、現在の環境(Windows7、Windows8.1)を考えると不向きですし、もともと簡単に実行環境を作る事が目的なので使ってはいけません。

PHP の登録

AN HTTP Serverは、フォルダの参照ができないので、自分でパスをコピーしてペーストしてやる必要があります。そして、PHP の場合は、チェックボックスを必ず二つチェックします。



以下は、php フォルダに置いて実行すると、php-cgi.exe を AnHttpd に自動登録するスクリプトです
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "wscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

Dim Fs,WshShell

Set WshShell = CreateObject("WScript.Shell")

Const ForWriting = 2
Set Fs = CreateObject("Scripting.FileSystemObject")
strCurPath = WScript.ScriptFullName
Set obj = Fs.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

const HKEY_LOCAL_MACHINE = &H80000002
Set obj = GetObject _
	("winmgmts:\\.\root\default:StdRegProv")
strKeyPath = "SOFTWARE\AnHttpd\default\Progs\Names"
obj.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
nCount = 0
bEntry = false
For Each strValue In arrValueNames
	nCount = nCount + 1
	strValue2 = UCase(strValue)
	if strValue2 = ".PHP" then
		bEntry = true
		Call WshShell.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd\default\Progs\Names\" & strValue,strCurPath & "\php-cgi.exe" )
	end if
Next

if not bEntry then
		Call WshShell.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd\default\Progs\Names\.php",strCurPath & "\php-cgi.exe" )
		Call WshShell.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd\default\Progs\Attrs\.php", 7, "REG_DWORD" )
		Call WshShell.RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\AnHttpd\default\Progs\Count", nCount+1, "REG_DWORD" )
end if


インデックスを表示させる



これを最初に必ずセットしておきます。


ここから先はお好みで

エイリアスを設定すると、ルート以外を参照可能になります



後は、ログの設定でトレースを出力するようにすると、ファイルのアップロードの際の内部フォーマットを確認できます。必要ならば、CGI 検査を出力するというチェックボックスが一般タブの下のほうにあります。

細かい話で言うと、Apache で動作するバイナリデータの直アップロードとかは動作しないので注意して下さい。さらに、C# とかで作った exe なんかを自作 CGI として動作させる事は可能です。




posted by at 21:29 | 開発用 | このブログの読者になる | 更新情報をチェックする