📄 nph-redirect.c
字号:
/* nph-redirect - simple redirection CGI program**** Copyright (C) 1995 by Jef Poskanzer <jef@acme.com>. All rights reserved.**** Redistribution and use in source and binary forms, with or without** modification, are permitted provided that the following conditions** are met:** 1. Redistributions of source code must retain the above copyright** notice, this list of conditions and the following disclaimer.** 2. Redistributions in binary form must reproduce the above copyright** notice, this list of conditions and the following disclaimer in the** documentation and/or other materials provided with the distribution.**** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF** SUCH DAMAGE.*//* Three steps to set up a redirection:** 1. Make sure your web server is set up to allow CGI programs.** 2. Make a symbolic link from the file you want to redirect,** pointing at this program in the CGI bin directory.** 3. Add an entry to the file ".redirects" in the directory where your** http server runs CGI programs. For most servers, this is the** directory where the given CGI program lives. The format of the** file is a bunch of lines with a filename, whitespace, and the new** URL. For example:/test/oldfile.html http://www.acme.com/test/newfile.html** The easiest way to figure out precisely what filename to put into** .redirects is to set up the symlink and then click on it. You'll get** back a "404 Not Found" page which includes the filename as received by** the redirect program, and that's what you want to use.**** Note: this is designed for thttpd (http://www.acme.com/software/thttpd/)** and using it with other web servers may require some hacking. A possible** gotcha is with the symbolic link from the old file pointing at this** script - servers other than thttpd may not allow that link to be run** as a CGI program, because they don't check the link to see that it** points into the allowed CGI directory.**** Note two: It would be really cool to have this program look for** the .redirects file in the same directory as the file being redirected,** instead of in the binaries directory. Unfortunately, this appears** to be impossible with the information CGI gives, plus the non-standardized** but widespread practice of running CGI programs in the directory where** the binary lives. Perhaps CGI 1.2 will address this.*/#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "config.h"static char* argv0;static voidinternal_error( char* reason ) { char* title = "500 Internal Error"; (void) printf( "\HTTP/1.0 %s\n\Content-type: text/html\n\\n\<HTML><HEAD><TITLE>%s</TITLE></HEAD>\n\<BODY><H2>%s</H2>\n\Something unusual went wrong during a redirection request:\n\<BLOCKQUOTE>\n\%s\n\</BLOCKQUOTE>\n\</BODY></HTML>\n", title, title, title, reason ); }static voidnot_found( char* script_name ) { char* title = "404 Not Found"; (void) printf( "\HTTP/1.0 %s\n\Content-type: text/html\n\\n\<HTML><HEAD><TITLE>%s</TITLE></HEAD>\n\<BODY><H2>%s</H2>\n\The requested filename, %s, is set up to be redirected to another URL;\n\however, the new URL has not yet been specified.\n\</BODY></HTML>\n", title, title, title, script_name ); }static voidmoved( char* script_name, char* url ) { char* title = "301 Moved"; (void) printf( "\HTTP/1.0 %s\n\Location: %s\n\Content-type: text/html\n\\n\<HTML><HEAD><TITLE>%s</TITLE></HEAD>\n\<BODY><H2>%s</H2>\n\The requested filename, %s, has moved to a new URL:\n\<A HREF=\"%s\">%s</A>.\n\</BODY></HTML>\n", title, url, title, title, script_name, url, url ); } intmain( int argc, char** argv ) { char* script_name; char* path_info; char* cp; FILE* fp; char buf[5000], file[5000], url[5000]; argv0 = argv[0]; /* Get the name that we were run as, which is the filename being ** redirected. */ script_name = getenv( "SCRIPT_NAME" ); if ( script_name == (char*) 0 ) { internal_error( "Couldn't get SCRIPT_NAME environment variable." ); exit( 1 ); } /* Append the PATH_INFO, if any. This allows redirection of whole ** directories. */ path_info = getenv( "PATH_INFO" ); if ( path_info != (char*) 0 ) { cp = (char*) malloc( strlen( script_name ) + strlen( path_info ) + 1 ); if ( cp == (char*) 0 ) { internal_error( "Out of memory." ); exit( 1 ); } (void) sprintf( cp, "%s%s", script_name, path_info ); script_name = cp; } /* Open the redirects file. */ fp = fopen( ".redirects", "r" ); if ( fp == (FILE*) 0 ) { internal_error( "Couldn't open .redirects file." ); exit( 1 ); } /* Search the file for a matching entry. */ while ( fgets( buf, sizeof(buf), fp ) != (char*) 0 ) { /* Remove comments. */ cp = strchr( buf, '#' ); if ( cp != (char*) 0 ) *cp = '\0'; /* Skip leading whitespace. */ cp = buf; cp += strspn( cp, " \t" ); /* Check for blank line. */ if ( *cp != '\0' ) { /* Parse line. */ if ( sscanf( cp, "%[^ \t\n] %[^ \t\n]", file, url ) == 2 ) { /* Check for match. */ if ( strcmp( file, script_name ) == 0 ) { /* Got it. */ moved( script_name, url ); exit( 0 ); } } } } /* No match found. */ not_found( script_name ); exit( 1 ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -