□技術メモ - CGI IIS設定
※管理人の個人的な技術メモです。サンプルソースを実行した結果について
管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。
-----------------------------------------------------------
・CGI(Common Gate Way)はWebアプリケーションを作る際に必要となります。
CGIは標準入出力と環境変数を取得できればどの言語でも作成可能です。
VBで記述した際の例はこのページの下の方を参照。実行ファイル名は test.exe とします。
クライアント側は以下のファイルを用意する。
--------
htmltest.html
Local Test
--------
・CGIをローカル環境でテストするにはローカルサーバが必要になります。
WinXPではフリーウェアのAN HTTPDが使用できますが、Win7では使用できないようです。(2014/09/02現在)
iis(Internet Information Service)は、WinXPではProfesshonai Editionでないと使用できませんでしたが、
Win7ではHome Editionで使用できるようになりました。
・Win7におけるiisの設定は以下の通り。
コントロールパネル→プログラム→Windowsの機能の有効化または無効化→iisに必要な機能をON
→以下のURLで確認 http://localhost/
ルートフォルダは C:\inetpub\wwwroot
「プログラムとファイルの検索」にiisと入力→iisマネージャを起動する。
・iisマネージャの最初の表示は以下の(1)から(3)
\user名 (1)
\サイト (2)
\DefaultWebSite (3)
\cgi-bin (4)
・iisの設定は以下の通り。
(3)を右クリックしてアプリケーションの追加→エイリアスに cgi-bin , 物理パスに C:\inetpub\wwwroot\cgi-bin を設定する。
ハンドラマッピング→CGI-exeが無効になっているので選択→機能のアクセス許可の編集→実行を許可
上記で設定した物理パスに test.exe , htmltest.html を配置する。
(1)を選択して「ISAPIおよびCGIの制限」をダブルクリック→追加
→ test.exe をファイルダイアログにて指定→拡張パスの実行を許可するをONに設定
・必要に応じて以下の設定を行う。
CGIがアクセスするファイルにはセキュリティ設定を行う。
コントロールパネル→ユーザアカウント→別のアカウント管理→GuestアカウントをONにする
→制限の設定を行う。
・実行は以下のURLを入力
http://localhost/cgi-bin/htmltest.html
textboxにアルファベットを入力してボタンを押すと Hello!CGI「入力した文字」が表示される。
(ただし、記号や全角文字は%記号付き表示になるし、半角スペースは + 記号になることに注意)
--------
modMain.bas
Option Explicit
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Public Const CGI_AUTH_TYPE As String = "AUTH_TYPE"
Public Const CGI_CONTENT_LENGTH As String = "CONTENT_LENGTH"
Public Const CGI_CONTENT_TYPE As String = "CONTENT_TYPE"
Public Const CGI_GATEWAY_INTERFACE As String = "GATEWAY_INTERFACE"
Public Const CGI_HTTP_ACCEPT As String = "HTTP_ACCEPT"
Public Const CGI_HTTP_REFERER As String = "HTTP_REFERER"
Public Const CGI_HTTP_USER_AGENT As String = "HTTP_USER_AGENT"
Public Const CGI_PATH_INFO As String = "PATH_INFO"
Public Const CGI_PATH_TRANSLATED As String = "PATH_TRANSLATED"
Public Const CGI_QUERY_STRING As String = "QUERY_STRING"
Public Const CGI_REMOTE_ADDR As String = "REMOTE_ADDR"
Public Const CGI_REMOTE_HOST As String = "REMOTE_HOST"
Public Const CGI_REMOTE_USER As String = "REMOTE_USER"
Public Const CGI_REQUEST_METHOD As String = "REQUEST_METHOD"
Public Const CGI_SCRIPT_NAME As String = "SCRIPT_NAME"
Public Const CGI_SERVER_NAME As String = "SERVER_NAME"
Public Const CGI_SERVER_PORT As String = "SERVER_PORT"
Public Const CGI_SERVER_PROTOCOL As String = "SERVER_PROTOCOL"
Public Const CGI_SERVER_SOFTWARE As String = "SERVER_SOFTWARE"
'Sleep
Public Declare Function Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long) As Long
'IN
Public Declare Function stdin Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_INPUT_HANDLE) As Long
'OUT
Public Declare Function stdout Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_OUTPUT_HANDLE) As Long
'ReadFile
Public Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
'WriteFile
Public Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Sub Main()
Dim sReadBuffer As String 'Readバッファ
Dim sWriteBuffer As String 'Writeバッファ
Dim lBytesRead As Long '実読み込みバイト数
Dim lBytesWritten As Long '実書き込みバイト数
Dim hStdIn As Long '標準入力ハンドル
Dim hStdOut As Long '標準出力ハンドル
Dim iPos As Integer ' = の位置
Dim wValue As String '取得した値
'環境変数
sReadBuffer = String$(CLng(Environ$(CGI_CONTENT_LENGTH)), 0)
'stdin
hStdIn = stdin()
'readBuffer
ReadFile hStdIn, sReadBuffer, Len(sReadBuffer), lBytesRead
' = のpos取得
iPos = InStr(sReadBuffer, "=")
'値の取得
wValue = Mid$(sReadBuffer, iPos + 1)
'Writeバッファ設定
sWriteBuffer = "HTTP/1.0 200 OK" & vbCrLf & _
"Content-Type: text/html" & vbCrLf & vbCrLf & _
"Hello,CGI! "
'stdout
hStdOut = stdout()
WriteFile hStdOut, sWriteBuffer, Len(sWriteBuffer) + 1, lBytesWritten '固定部表示
WriteFile hStdOut, wValue, Len(wValue), lBytesWritten '可変部表示
End Sub
--------