Apache + CGI로 모든 HTTP 요청 헤더 출력

1. 하고 싶은 일



웹 서버가 수신하는 HTTP 요청 헤더를 확인하고 싶기 때문에 모든 HTTP 요청 헤더를 출력하는 페이지를 만듭니다. OS는 CentOS7, CGI는 파이썬을 사용합니다.
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

2. Apache 도입


# yum install httpd
# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

3. /etc/httpd/conf/httpd.conf 편집



Apache 구성 파일(/etc/httpd/conf/httpd.conf) 편집

# SriptAliasの確認の確認
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

# /var/www/cgi-bin配下でCGIの実行を許可するように指定
# また、pyを拡張子に持つすべてのファイルを CGI プログラムとしてみなす
<Directory "/var/www/cgi-bin">
     AllowOverride None
     Options +ExecCGI
     Require all granted
     AddHandler cgi-script .py 
</Directory>

4. CGI 스크립트 배치


  • CGI 스크립트는 를 참고했다. 출력이 암구름에 줄지어 있어도 알기 어려우므로, 이름을 Sort하도록(듯이) 미정정하고 있다.
  • Origin 서버는 CentOS7이므로 Python2.7 기반으로 설명.
  • Apache mod_cgi는 HTTP 요청 헤더를 환경 변수로 설정할 때 다음 작업을 수행합니다. 그 때문에, HTTP_ 라고 하는 prefix를 가지는 것만을 출력하고 있다.
  • HTTP 헤더 이름을 대문자 변환합니다.
  • "-"를 "_"로 변환합니다.
  • "HTTP_"라는 접두사를 붙인다.


  • /var/www/cgi-bin/test.py
    #!/usr/bin/env python
    
    import os
    print "Content-Type: text/html"
    print "Cache-Control: no-cache"
    print
    
    print "<html><body>"
    for headername, headervalue in sorted(os.environ.iteritems()):
        if headername.startswith("HTTP_"):
            print "{0} = {1}<br>".format(headername, headervalue)
    
    print "</html></body>"
    

    권한 변경 및 Apache 재부팅
    # chmod 755 /var/www/cgi-bin/test.py
    # systemctl restart httpd
    

    5. 검증



    curl에서 테스트
    # curl http://localhost/cgi-bin/test.py
    <html><body>
    HTTP_ACCEPT = */*<br>
    HTTP_HOST = localhost<br>
    HTTP_USER_AGENT = curl/7.29.0<br>
    </html></body>
    

    브라우저에서 테스트


    2021/06/25 보충



    단순히 HTTP 헤더를 출력하고 싶은 앱을 만들고 싶다면 이것으로 좋았을지도. . .
    # yum install -y httpd
    # yum install -y php
    # echo "<?php phpinfo(); ?>" > /var/www/html/test.php
    # systemctl start httpd
    

    좋은 웹페이지 즐겨찾기