初音 玲 HATSUNE, Akira
| Apache知っていますか? |
|---|

| Apache for Win32をインストールする前に |
|---|
| Apache for Win32をインストールする |
|---|


| Apache for Win32を起動する |
|---|
Apache/1.3.9 (Win32) running...と表示されれば、無事起動したことになる。
APACHE.EXE: cannot determine local host name. Use the ServerName directive to set it manually. |


ServerName www.balthasal.nerv.go.jp |
| Apache for Win32を停止する |
|---|
Apache -k shutdownを入力して、終了処理を行なわせる。もし、起動しているDOSプロンプトを終了させると、終了処理が行なわれないために、次回起動時にリスト3のメッセージが表示されるが、とりあえず心配する必要はない。
[Wed Mar 01 21:15:54 2000] [warn] pid file d:/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run? |
| Apache for Win32を設定する |
|---|
Apache -k restartでも可能だ。
<コンテナ指示子 指示対象>
指示子 設定値
:
</コンテナ指示子>
だ。コンテナ指示子は、設定する対象が複数存在するようなときに、その対象を指定するときに存在する。DocumentRoot "d:/data/www/pub/htdocs"のように、そのフォルダを絶対パスで指定する。なお、フォルダを指定するときの区切り記号は、“\”ではなく、UNIXと同じように“/”だ。
<Directory /> : </Directory> <Directory "D:\Apache\htdocs"> : </Directory>の2つのDocumentRootに対応するコンテナ指示子がある。このように同じ対象を指定した設定が複数ある場合、後ろに記述された指示子で設定が行なわれる(サーバー指示子が省略されているときは、すでに指定されている設定値を継承する)。よって、Directoryコンテナ指示子のようにサブフォルダも含むようなものの場合は、サブフォルダへの個別設定は、その上位フォルダの設定よりも後ろに記述しないと有効にならない。
Options Noneを指定して、CGIディレクトリのみ、
Options ExecCGIと指定するのがいいだろう。
| オプション | 備考 |
|---|---|
| None | すべてのオプションを無効にする |
| All | すべてのオプションを有効にする |
| Indexes | ディレクトリリストをクライアント側に送信する |
| Includes | サーバー側インクルードを有効にする |
| IncludesNOEXEC | #execと#include以外のサーバー側インクルードのみ有効にする |
| ExecCGI | CGIスクリプトの実行を有効にする |
| 設定値 | 備考 |
|---|---|
| None | .htAccessによる設定を無視する |
| All | .htAccessの設定をすべて有効にする |
| AuthConfig | .htAccessの認証指示子を有効にする |
| FileInfo | .htAccessのドキュメントの種類を管理する指示子を有効にする |
| Indexes | .htAccessのインデックス表示指示子を有効にする |
| Limit | .htAccessのアクセス管理指示子を有効にする |
| Options | .htAccessのOptions指示子を有効にする |
Allow from .hogehoge.co.jpのように指定すれば、hogehoge.co.jp内のマシンからのアクセスだけを許可する事ができる。支店からのみアクセス可能なディレクトリを作るようなときには、支店をfk.hogehoge.co.jpやos.hogehoge.co.jpのようにサブドメインにまとめておけば、Allow指示子ひとつでOKだ)。逆に、
Deny from hogehoge.co.jpとすれば、特定の会社からのアクセスを拒否することもできる。ところで、
Allow from hogehoge.co.jp Deny from Allのように矛盾した記述はどう扱われるのだろうか。これは、Apacheの設定ファイルの評価基準に従えば、Allowを評価してからDenyを評価することになり、どこからもアクセスを拒否することになる。このようにAllowとDenyの順番は密接に結びついているので、特別にOrder指示子が存在する。
Order Deny,Allowと指定しておけば、Deny→Allowの順に評価され、hogehoge.co.jp以外からのアクセスを禁止することができる。
UserDir "D:/Apache/user/と指定しておけば、
http://localhost/~mypage/のように入力したとき、Apacheは、
D:\Apache\user\mypage\index.htmlのファイルをWebブラウザに返却する(図6)。

<Files .htaccess>
Order Allow,Deny
Deny from All
</Files>
と指定する。もちろんこのように指定してもApache自体はこの.htaccessの設定を使う事ができる。
NameVirtualHost IPアドレス:ポート番号
<VirtualHost IPアドレス:ポート番号>
ServerName www.hogehoge.co.jp
ServerAdmin webmaster@hogehoge.co.jp
DocumentRoot /www/hogehoge/public/htdocs
</VirtualHost>
なお、仮想ホストの管理方法には、NameVirtualHost IPアドレス:ポート番号 <VirtualHost IPアドレス:ポート番号> ServerName www.shoeisha.co.jp ServerAdmin webmaster@shoeisha.co.jp DocumentRoot /www/shoeisha/public/htdocs </VirtualHost> <VirtualHost IPアドレス:ポート番号> ServerName www.hogehoge.co.jp ServerAdmin webmaster@hogehoge.co.jp DocumentRoot /www/hogehoge/public/htdocs </VirtualHost>《2》のIPベースでは、1台のマシンに複数のIPアドレスを割り当て、そのIPアドレスごとにWebSiteを割り当てる方法だ。この方法でwww.shoeisha.co.jpとwww.hogehoge.co.jpの2つのWebSiteをひとつのApacheで管理するには、2つのNameVirtualHost指示子それぞれに(つまり2つの)VirtualHostコンテナ識別子を記述すればよい。
ResourceConfig nul AccessConfig nulという記述をhttpd.confファイルに行なっても、Apache起動時にエラーとなってしまう。こういった細かな障害は存在するので、エラーが発生したら、対処方法としては、たとえば、null.confという名前で空のファイルを作成して、
ResourceConfig conf/null.conf AccessConfig conf/null.confのように指定する。
| Apache for Win32を使う |
|---|
| Apache+VB-CGI |
|---|

ScriptAlias /cgi-bin/ "D:/Apache/cgi-bin/" <Directory "D:/Apache/cgi-bin"> AllowOverride None Options ExecCGI </Directory>のようにCGIディレクトリを指定する。これで、あとはCGIディレクトリに標準EXEをコピーすればCGIとして実行される。もちろん、httpd.confファイルを変更したら、Apacheの再起動を行なうことを忘れてはいけない。
Option Explicit
Declare Function GetStdHandle Lib "kernel32" _
(ByVal nStdHandle As Long) As Long
Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, _
lpBuffer As Any, _
ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, _
ByVal lpOverlapped As Long) As Long
Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, _
lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, _
lpOverlapped As Any) As Long
Public Const STD_INPUT_HANDLE As Long = -10&
Public Const STD_OUTPUT_HANDLE As Long = -11&
Public Const STD_ERROR_HANDLE As Long = -12&
Private Sub Main()
On Error GoTo errMain:
' printf "HTTP/1.1 200 OK" & vbCrLf ' 応答コード部
printf "Content-type: text/html" & vbCrLf & vbCrLf ' ヘッダ部
printf "" & vbCrLf
printf "
|

%% [Sun Mar 05 19:55:34 2000] GET /cgi-bin/cgi.exe HTTP/1.1 %% 500 d:/apache/cgi-bin/cgi.exe %request Accept: */* Accept-Encoding: gzip, deflate Accept-Language: ja Connection: Keep-Alive Host: localhost User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) %response HTTP/1.1 200 OK %stdout Content-type: text/html <HTML> <HEAD><TITLE>Hello, World!</TITLE></HEAD> <BODY>こんにちは、世界!</BODY> </HTML> |
ScriptLog "D:/Apache/log/cgi.log"だ。もちろん、指定後にはApacheの再起動が必要だ。
| 変数名 | 意味 |
|---|---|
| AUTH_TYPE | 認証タイプ |
| CONTENT_LENGTH | POSTメソッドで渡されるデータのバイト数 |
| CONTENT_TYPE | POSTメソッドで渡される情報の種類 |
| REMOTE_ADDR | クライアントのIPアドレス |
| REMOTE_HOST | クライアントのホスト名 |
| REMOTE_USER | ユーザー名 |
| REQUEST_METHOD | 要求メソッド(POSTやGET) |
| SCRIPT_NAME | スクリプト名 |
| SERVER_NAME | サーバー名 |
| SERVER_PORT | 要求を受け取ったポート番号 |
| URL | 要求されたURL |

<html> <head><title>StdIn Test Driver</title></head> <body> <FORM METHOD="POST" ACTION="/cgi-bin/CGIStdIn.exe"> <table> <tr> <td>UserID:</td> <td><INPUT NAME="strUID" SIZE=8 MAXLENGTH=8 value="scott"><br></td> </tr> <tr> <td>Password:</td> <td><INPUT NAME="strPass" TYPE="PASSWORD" SIZE=8 MAXLENGTH=8 value="tiger"><br></td> </tr> <tr> <td>Database:</td> <td><INPUT NAME="strHost" SIZE=8 MAXLENGTH=8 value="kawa8"><br></td> </tr> <tr> <td>SQL:</td> <td><TEXTAREA NAME="strSQL" cols=80>SELECT * FROM EMP ORDER BY EMPNO</TEXTAREA><br></td> </tr> </table> <INPUT TYPE="SUBMIT" VALUE="検索"> </form> </body> </html> |
Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, _
lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, _
lpOverlapped As Any) As Long
Public Const STD_INPUT_HANDLE As Long = -10&
Private Function getchar() As String
Dim abytBuffer() As Byte
Dim lngInLen As Long
Dim lngBytes As Long
Dim hStdIn As Long
Dim lngRet As Long
Dim strBuffer As String
On Error GoTo errChar:
lngInLen = Environ("CONTENT_LENGTH")
If lngInLen > 0 Then
ReDim abytBuffer(lngInLen)
strBuffer = String(lngInLen, Chr$(0))
hStdIn = GetStdHandle(STD_INPUT_HANDLE)
lngRet = ReadFile(hStdIn, _
ByVal strBuffer, _
lngInLen, _
lngBytes, _
ByVal 0&)
getchar = Left$(strBuffer, lngBytes)
Else
getchar = ""
End If
exitChar:
On Error Resume Next
Exit Function
errChar:
printf Error$ & vbCrLf
Resume exitChar:
Resume Next
End Function
|
Private Function strURLDecode(ByVal rstrPost As String) As String
Dim intindex As Integer
Dim intPos As Integer
Dim strAsc As String
' 8bit Decode
intindex = 1
strURLDecode = ""
intPos = InStr(rstrPost, "%")
Do While intPos > 0
If intPos > 1 Then
strURLDecode = strURLDecode & Mid$(rstrPost, _
intindex, _
intPos - 1)
intindex = intindex + intPos
Else
intindex = intindex + 1
End If
strAsc = StrConv(Mid$(rstrPost, intindex, 2), _
vbUpperCase)
intindex = intindex + 2
If strAsc > "7F" Then
' 漢字項目なので
If Mid$(rstrPost, intindex, 1) = "%" Then
strAsc = Chr(CInt("&H" & strAsc _
& Mid$(rstrPost, _
intindex + 1, 2)))
intindex = intindex + 3
Else
strAsc = Chr$(CInt("&H" & strAsc & _
Hex(Asc(Mid$(rstrPost, _
intindex, 1)))))
intindex = intindex + 1
End If
Else
strAsc = Chr$(CInt("&H" & strAsc))
End If
strURLDecode = strURLDecode & strAsc
intPos = InStr(Mid$(rstrPost, intindex), "%")
Loop
strURLDecode = strURLDecode & Mid$(rstrPost, _
intindex)
' + Decode
strAsc = strURLDecode
#If VB6 Then
strURLDecode = Replace(strAsc, "+", " ", _
1, -1, vbTextCompare)
#Else
intPos = InStr(strAsc, "+")
Do While intPos > 0
Mid$(strAsc, intPos, 1) = " "
intPos = InStr(strAsc, "+")
Loop
strURLDecode = strAsc
#End If
End Function
|


| Apache+VB-CGI+ActiveX EXE |
|---|



| 最後に |
|---|
■【動作確認環境】 ThinkPad 240 2609-31J Windows 98 SE 4.10.2222A IE5 5.00.2614.3500 Office 2000 Developer Visual Basic 6.0 (SP3)