拡張子なしのCGI
はじめに
拡張子なしでCGIを呼び出し、PATH_INFOで情報をやり取りする方法です。
色々便利なことがあり、特に最近はSEOの為に利用することが多いようです。
ここでは、show.cgi?a=1&b=1を show/a/1/b/1/のようにしてみましょう。
show.cgi
cgi.paramの情報を表示します。
#!/usr/bin/ruby -Ke
require "cgi"
require "htmltemplate"
cgi = CGI.new()
html = HTMLTemplate.open( "show.html" )
html.gsub!( "(\ttitle\t)", cgi.query_string.to_s )
html.block( "params" ) do |block|
cgi.params.collect do |key,val|
str = block.dup
str.gsub!( "(\tkey\t)", CGI::escapeHTML( key ) )
str.gsub!( "(\tval\t)", CGI::escapeHTML( val.inspect ) )
str
end
end
cgi.out do
html.to_s
end
require "cgi"
require "htmltemplate"
cgi = CGI.new()
html = HTMLTemplate.open( "show.html" )
html.gsub!( "(\ttitle\t)", cgi.query_string.to_s )
html.block( "params" ) do |block|
cgi.params.collect do |key,val|
str = block.dup
str.gsub!( "(\tkey\t)", CGI::escapeHTML( key ) )
str.gsub!( "(\tval\t)", CGI::escapeHTML( val.inspect ) )
str
end
end
cgi.out do
html.to_s
end
$ ln -s show.cgi show_cgi.txt
show
cgi.path_infoの情報を表示します。
#!/usr/bin/ruby -Ke
require "cgi"
require "htmltemplate"
cgi = CGI.new()
html = HTMLTemplate.open( "show.html" )
array = cgi.path_info.to_s.split( /\// )
array.shift
array.push nil if array.size % 2 != 0
params = {}
0.step( array.size-1, 2 ) do |i|
params[array[i]] = [] if !params[array[i]]
params[array[i]].push array[i+1]
end
html.gsub!( "(\ttitle\t)", cgi.path_info.to_s )
html.block( "params" ) do |block|
params.collect do |key,val|
str = block.dup
str.gsub!( "(\tkey\t)", CGI::escapeHTML( key ) )
str.gsub!( "(\tval\t)", CGI::escapeHTML( val.inspect ) )
end
end
cgi.out do
html.to_s
end
require "cgi"
require "htmltemplate"
cgi = CGI.new()
html = HTMLTemplate.open( "show.html" )
array = cgi.path_info.to_s.split( /\// )
array.shift
array.push nil if array.size % 2 != 0
params = {}
0.step( array.size-1, 2 ) do |i|
params[array[i]] = [] if !params[array[i]]
params[array[i]].push array[i+1]
end
html.gsub!( "(\ttitle\t)", cgi.path_info.to_s )
html.block( "params" ) do |block|
params.collect do |key,val|
str = block.dup
str.gsub!( "(\tkey\t)", CGI::escapeHTML( key ) )
str.gsub!( "(\tval\t)", CGI::escapeHTML( val.inspect ) )
end
end
cgi.out do
html.to_s
end
show.html
PATH_INFOを利用した場合相対パスはで戻れないので絶対パスで指定しています。
<?xml version="1.0" encoding="euc-jp"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>( title )</title>
</head>
<body>
<h1>( title )</h1>
<dl>
<!-- params_begin -->
<dt>( key )</dt>
<dd>( val )</dd>
<!-- params_end -->
</dl>
<p>
<a href="https://linux-life.net/program/ruby/cgidoc/noextension/">拡張子なしのCGI</a>に戻る
</p>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>( title )</title>
</head>
<body>
<h1>( title )</h1>
<dl>
<!-- params_begin -->
<dt>( key )</dt>
<dd>( val )</dd>
<!-- params_end -->
</dl>
<p>
<a href="https://linux-life.net/program/ruby/cgidoc/noextension/">拡張子なしのCGI</a>に戻る
</p>
</body>
</html>
.htaccess
<Files show>
SetHandler cgi-script
</Files>
SetHandler cgi-script
</Files>
$ ln -s .htaccess htaccess.txt