mirror of
https://github.com/apache/httpd.git
synced 2025-09-13 22:01:52 +03:00
markup & formatting
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@98066 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -60,32 +60,29 @@
|
||||
it, when that particular resource is requested by a
|
||||
client.</p>
|
||||
|
||||
<p>The
|
||||
<code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
|
||||
|
||||
<p>The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
|
||||
directive looks like:</p>
|
||||
|
||||
<div class="example"><p><code>ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/</code></p></div>
|
||||
|
||||
<p>The example shown is from your default
|
||||
<code>httpd.conf</code>
|
||||
<div class="example"><p><code>
|
||||
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
|
||||
</code></p></div>
|
||||
|
||||
<p>The example shown is from your default <code>httpd.conf</code>
|
||||
configuration file, if you installed Apache in the default
|
||||
location. The <code>ScriptAlias</code> directive is much like the
|
||||
<code>Alias</code> directive, which defines a URL prefix that
|
||||
is to mapped to a particular directory. <code>Alias</code>
|
||||
and <code>ScriptAlias</code> are usually used for directories
|
||||
that are outside of the <code>DocumentRoot</code> directory.
|
||||
The difference between <code>Alias</code> and
|
||||
<code>ScriptAlias</code> is that <code>ScriptAlias</code>
|
||||
has the added meaning that everything under that URL prefix
|
||||
will be considered a CGI program. So, the example above tells
|
||||
Apache that any request for a resource beginning with
|
||||
<code>/cgi-bin/</code> should be served from the directory
|
||||
<code>/usr/local/apache/cgi-bin/</code>, and should be treated
|
||||
as a CGI program.</p>
|
||||
location. The <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
|
||||
directive is much like the <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> directive, which defines a URL prefix that
|
||||
is to mapped to a particular directory. <code class="directive">Alias</code>
|
||||
and <code class="directive">ScriptAlias</code> are usually used for
|
||||
directories that are outside of the <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> directory. The difference between
|
||||
<code class="directive">Alias</code> and <code class="directive">ScriptAlias</code>
|
||||
is that <code class="directive">ScriptAlias</code> has the added meaning
|
||||
that everything under that URL prefix will be considered a CGI
|
||||
program. So, the example above tells Apache that any request for a
|
||||
resource beginning with <code>/cgi-bin/</code> should be served from
|
||||
the directory <code>/usr/local/apache/cgi-bin/</code>, and should be
|
||||
treated as a CGI program.</p>
|
||||
|
||||
<p>For example, if the URL
|
||||
<p>For example, if the URL
|
||||
<code>http://www.example.com/cgi-bin/test.pl</code>
|
||||
is requested, Apache will attempt to execute the file
|
||||
<code>/usr/local/apache/cgi-bin/test.pl</code>
|
||||
@@ -97,66 +94,71 @@
|
||||
<h3><a name="nonscriptalias" id="nonscriptalias">CGI outside of ScriptAlias directories</a></h3>
|
||||
|
||||
|
||||
<p>CGI programs are often restricted to
|
||||
<code>ScriptAlias</code>'ed directories for security reasons.
|
||||
In this way,
|
||||
administrators can tightly control who is allowed to use CGI
|
||||
programs. However, if the proper security precautions are
|
||||
<p>CGI programs are often restricted to <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>'ed directories for security reasons.
|
||||
In this way, administrators can tightly control who is allowed to
|
||||
use CGI programs. However, if the proper security precautions are
|
||||
taken, there is no reason why CGI programs cannot be run from
|
||||
arbitrary directories. For example, you may wish to let users
|
||||
have web content in their home directories with the
|
||||
<code>UserDir</code> directive. If they want to have their own
|
||||
CGI programs, but don't have access to the main
|
||||
<code>cgi-bin</code> directory, they will need to be able to
|
||||
<code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code> directive.
|
||||
If they want to have their own CGI programs, but don't have access to
|
||||
the main <code>cgi-bin</code> directory, they will need to be able to
|
||||
run CGI programs elsewhere.</p>
|
||||
|
||||
|
||||
<h3><a name="options" id="options">Explicitly using Options to permit CGI execution</a></h3>
|
||||
|
||||
|
||||
<p>You could explicitly use the <code>Options</code>
|
||||
directive, inside your main server configuration file, to
|
||||
specify that CGI execution was permitted in a particular
|
||||
<p>You could explicitly use the <code class="directive"><a href="../mod/core.html#options">Options</a></code> directive, inside your main server configuration
|
||||
file, to specify that CGI execution was permitted in a particular
|
||||
directory:</p>
|
||||
|
||||
<div class="example"><p><code><Directory /usr/local/apache/htdocs/somedir> <br />
|
||||
Options +ExecCGI<br />
|
||||
</Directory></code></p></div>
|
||||
<div class="example"><p><code>
|
||||
<Directory /usr/local/apache/htdocs/somedir><br />
|
||||
<span class="indent">
|
||||
Options +ExecCGI<br />
|
||||
</span>
|
||||
</Directory>
|
||||
</code></p></div>
|
||||
|
||||
<p>The above directive tells Apache to permit the execution
|
||||
of CGI files. You will also need to tell the server what
|
||||
files are CGI files. The following
|
||||
<code>AddHandler</code>
|
||||
files are CGI files. The following <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> directive tells the server to treat all
|
||||
files with the <code>cgi</code> or <code>pl</code> extension as CGI
|
||||
programs:</p>
|
||||
|
||||
directive tells the server to treat all files with the
|
||||
<code>cgi</code> or <code>pl</code> extension as CGI programs:</p>
|
||||
|
||||
<div class="example"><p><code>AddHandler cgi-script cgi pl</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
AddHandler cgi-script cgi pl
|
||||
</code></p></div>
|
||||
|
||||
|
||||
<h3><a name="htaccess" id="htaccess">.htaccess files</a></h3>
|
||||
|
||||
|
||||
<p>A <code>.htaccess</code> file is a way to set configuration
|
||||
directives on a per-directory basis. When Apache serves a
|
||||
resource, it looks in the directory from which it is serving
|
||||
<p>A <a href="htaccess.html"><code>.htaccess</code> file</a> is a way
|
||||
to set configuration directives on a per-directory basis. When Apache
|
||||
serves a resource, it looks in the directory from which it is serving
|
||||
a file for a file called <code>.htaccess</code>, and, if it
|
||||
finds it, it will apply directives found therein.
|
||||
|
||||
<code>.htaccess</code> files can be permitted with the
|
||||
<code>AllowOverride</code> directive, which specifies what
|
||||
types of directives can
|
||||
<code class="directive"><a href="../mod/core.html#allowoverride">AllowOverride</a></code> directive,
|
||||
which specifies what types of directives can
|
||||
appear in these files, or if they are not allowed at all. To
|
||||
permit the directive we will need for this purpose, the
|
||||
following configuration will be needed in your main server
|
||||
configuration:</p>
|
||||
|
||||
<div class="example"><p><code>AllowOverride Options</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
AllowOverride Options
|
||||
</code></p></div>
|
||||
|
||||
<p>In the <code>.htaccess</code> file, you'll need the
|
||||
following directive:</p>
|
||||
|
||||
<div class="example"><p><code>Options +ExecCGI</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
Options +ExecCGI
|
||||
</code></p></div>
|
||||
|
||||
<p>which tells Apache that execution of CGI programs is
|
||||
permitted in this directory.</p>
|
||||
@@ -174,7 +176,9 @@
|
||||
what sort of content it is receiving. Most of the time, this
|
||||
will look like:</p>
|
||||
|
||||
<div class="example"><p><code>Content-type: text/html</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
Content-type: text/html
|
||||
</code></p></div>
|
||||
|
||||
<p>Secondly, your output needs to be in HTML, or some other
|
||||
format that a browser will be able to display. Most of the
|
||||
@@ -193,9 +197,10 @@
|
||||
file called <code>first.pl</code>, and put it in your
|
||||
<code>cgi-bin</code> directory.</p>
|
||||
|
||||
<div class="example"><p><code>#!/usr/bin/perl<br />
|
||||
print "Content-type: text/html\n\n";<br />
|
||||
print "Hello, World.";
|
||||
<div class="example"><p><code>
|
||||
#!/usr/bin/perl<br />
|
||||
print "Content-type: text/html\n\n";<br />
|
||||
print "Hello, World.";
|
||||
</code></p></div>
|
||||
|
||||
<p>Even if you are not familiar with Perl, you should be able
|
||||
@@ -207,20 +212,20 @@
|
||||
talked about, followed by two carriage-return newline pairs.
|
||||
This puts a blank line after the header, to indicate the end
|
||||
of the HTTP headers, and the beginning of the body. The third
|
||||
line prints the string ``Hello, World.'' And that's the end
|
||||
line prints the string "Hello, World.". And that's the end
|
||||
of it.</p>
|
||||
|
||||
<p>If you open your favorite browser and tell it to get the
|
||||
address</p>
|
||||
|
||||
<div class="example"><p><code>http://www.example.com/cgi-bin/first.pl</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
http://www.example.com/cgi-bin/first.pl
|
||||
</code></p></div>
|
||||
|
||||
<p>or wherever you put your file, you will see the one line
|
||||
<code>Hello, World.</code>
|
||||
|
||||
appear in your browser window. It's not very exciting, but
|
||||
once you get that working, you'll have a good chance of
|
||||
getting just about anything working.</p>
|
||||
<code>Hello, World.</code> appear in your browser window.
|
||||
It's not very exciting, but once you get that working, you'll
|
||||
have a good chance of getting just about anything working.</p>
|
||||
|
||||
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
|
||||
<div class="section">
|
||||
@@ -232,35 +237,21 @@
|
||||
|
||||
<dl>
|
||||
<dt>The output of your CGI program</dt>
|
||||
|
||||
<dd>Great! That means everything worked fine.
|
||||
</dd>
|
||||
<dd>Great! That means everything worked fine.</dd>
|
||||
|
||||
<dt>The source code of your CGI program or a "POST Method Not
|
||||
Allowed" message</dt>
|
||||
|
||||
<dd>That means that you have not properly configured Apache
|
||||
to process your CGI program. Reread the section on
|
||||
<a href="#configuringapachetopermitcgi">configuring
|
||||
Apache</a>
|
||||
|
||||
and try to find what you missed.
|
||||
</dd>
|
||||
Apache</a> and try to find what you missed.</dd>
|
||||
|
||||
<dt>A message starting with "Forbidden"</dt>
|
||||
|
||||
<dd>That means that there is a permissions problem. Check the
|
||||
|
||||
<a href="#errorlogs">Apache error log</a>
|
||||
|
||||
and the section below on
|
||||
<a href="#permissions">file permissions</a>.
|
||||
|
||||
<br />
|
||||
</dd>
|
||||
<a href="#errorlogs">Apache error log</a> and the section below on
|
||||
<a href="#permissions">file permissions</a>.</dd>
|
||||
|
||||
<dt>A message saying "Internal Server Error"</dt>
|
||||
|
||||
<dd>If you check the
|
||||
<a href="#errorlogs">Apache error log</a>, you will probably
|
||||
find that it says "Premature end of
|
||||
@@ -276,22 +267,23 @@
|
||||
|
||||
<p>Remember that the server does not run as you. That is,
|
||||
when the server starts up, it is running with the permissions
|
||||
of an unprivileged user - usually ``nobody'', or ``www'' -
|
||||
and so it will need extra permissions to execute files that
|
||||
are owned by you. Usually, the way to give a file sufficient
|
||||
permissions to be executed by ``nobody'' is to give everyone
|
||||
execute permission on the file:</p>
|
||||
of an unprivileged user - usually <code>nobody</code>, or
|
||||
<code>www</code> - and so it will need extra permissions to
|
||||
execute files that are owned by you. Usually, the way to give
|
||||
a file sufficient permissions to be executed by <code>nobody</code>
|
||||
is to give everyone execute permission on the file:</p>
|
||||
|
||||
<div class="example"><p><code>chmod a+x first.pl</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
chmod a+x first.pl
|
||||
</code></p></div>
|
||||
|
||||
<p>Also, if your program reads from, or writes to, any other
|
||||
files, those files will need to have the correct permissions
|
||||
to permit this.</p>
|
||||
|
||||
<p>The exception to this is when the server is configured to
|
||||
use <a href="../suexec.html">suexec</a>.
|
||||
|
||||
This program allows CGI programs to be run under different
|
||||
use <a href="../suexec.html">suexec</a>. This program allows
|
||||
CGI programs to be run under different
|
||||
user permissions, depending on which virtual host or user
|
||||
home directory they are located in. Suexec has very strict
|
||||
permission checking, and any failure in that checking will
|
||||
@@ -319,7 +311,9 @@
|
||||
interpreter (often <code>perl</code>) indicated in the first
|
||||
line of your CGI program, which will look something like:</p>
|
||||
|
||||
<div class="example"><p><code>#!/usr/bin/perl</code></p></div>
|
||||
<div class="example"><p><code>
|
||||
#!/usr/bin/perl
|
||||
</code></p></div>
|
||||
|
||||
<p>Make sure that this is in fact the path to the
|
||||
interpreter.</p>
|
||||
@@ -356,7 +350,7 @@
|
||||
become useful to understand more about what's happening behind
|
||||
the scenes. Specifically, how the browser and server
|
||||
communicate with one another. Because although it's all very
|
||||
well to write a program that prints ``Hello, World.'', it's not
|
||||
well to write a program that prints "Hello, World.", it's not
|
||||
particularly useful.</p>
|
||||
|
||||
<h3><a name="env" id="env">Environment variables</a></h3>
|
||||
@@ -379,9 +373,7 @@
|
||||
<p>These variables are available to the CGI programmer, and
|
||||
are half of the story of the client-server communication. The
|
||||
complete list of required variables is at
|
||||
<a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">
|
||||
http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>
|
||||
</p>
|
||||
<a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>.</p>
|
||||
|
||||
<p>This simple Perl CGI program will display all of the
|
||||
environment variables that are being passed around. Two
|
||||
@@ -393,15 +385,17 @@
|
||||
see some variables listed that were not in the official list.
|
||||
In addition, Apache provides many different ways for you to
|
||||
<a href="../env.html">add your own environment variables</a>
|
||||
|
||||
to the basic ones provided by default.</p>
|
||||
|
||||
<div class="example"><p><code>
|
||||
#!/usr/bin/perl<br />
|
||||
print "Content-type: text/html\n\n";<br />
|
||||
foreach $key (keys %ENV) {<br />
|
||||
print "$key --> $ENV{$key}<br>";<br />
|
||||
}</code></p></div>
|
||||
#!/usr/bin/perl<br />
|
||||
print "Content-type: text/html\n\n";<br />
|
||||
foreach $key (keys %ENV) {<br />
|
||||
<span class="indent">
|
||||
print "$key --> $ENV{$key}<br>";<br />
|
||||
</span>
|
||||
}
|
||||
</code></p></div>
|
||||
|
||||
|
||||
<h3><a name="stdin" id="stdin">STDIN and STDOUT</a></h3>
|
||||
@@ -420,7 +414,7 @@
|
||||
The program then can process that data as though it was
|
||||
coming in from the keyboard, or from a file</p>
|
||||
|
||||
<p>The ``special format'' is very simple. A field name and
|
||||
<p>The "special format" is very simple. A field name and
|
||||
its value are joined together with an equals (=) sign, and
|
||||
pairs of values are joined together with an ampersand
|
||||
(&). Inconvenient characters like spaces, ampersands, and
|
||||
@@ -429,7 +423,7 @@
|
||||
something like:</p>
|
||||
|
||||
<div class="example"><p><code>
|
||||
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
|
||||
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
|
||||
</code></p></div>
|
||||
|
||||
<p>You'll sometimes also see this type of string appended to
|
||||
@@ -456,14 +450,13 @@
|
||||
|
||||
<p>If you're writing CGI programs in Perl, modules are
|
||||
available on <a href="http://www.cpan.org/">CPAN</a>. The most
|
||||
popular module for this purpose is CGI.pm. You might
|
||||
also consider CGI::Lite, which implements a minimal set of
|
||||
functionality, which is all you need in most programs.</p>
|
||||
popular module for this purpose is <code>CGI.pm</code>. You might
|
||||
also consider <code>CGI::Lite</code>, which implements a minimal
|
||||
set of functionality, which is all you need in most programs.</p>
|
||||
|
||||
<p>If you're writing CGI programs in C, there are a variety of
|
||||
options. One of these is the CGIC library, from
|
||||
<a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>
|
||||
</p>
|
||||
options. One of these is the <code>CGIC</code> library, from
|
||||
<a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>.</p>
|
||||
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
|
||||
<div class="section">
|
||||
<h2><a name="moreinfo" id="moreinfo">For more information</a></h2>
|
||||
@@ -471,20 +464,15 @@
|
||||
|
||||
<p>There are a large number of CGI resources on the web. You
|
||||
can discuss CGI problems with other users on the Usenet group
|
||||
comp.infosystems.www.authoring.cgi. And the -servers mailing
|
||||
<a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a>. And the -servers mailing
|
||||
list from the HTML Writers Guild is a great source of answers
|
||||
to your questions. You can find out more at
|
||||
<a href="http://www.hwg.org/lists/hwg-servers/">
|
||||
http://www.hwg.org/lists/hwg-servers/</a>
|
||||
</p>
|
||||
<a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a>.</p>
|
||||
|
||||
<p>And, of course, you should probably read the CGI
|
||||
specification, which has all the details on the operation of
|
||||
CGI programs. You can find the original version at the
|
||||
<a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">
|
||||
NCSA</a>
|
||||
|
||||
and there is an updated draft at the
|
||||
<a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a> and there is an updated draft at the
|
||||
<a href="http://web.golux.com/coar/cgi/">Common Gateway
|
||||
Interface RFC project</a>.</p>
|
||||
|
||||
|
Reference in New Issue
Block a user