我正在使用 mod_rewrite 将所有传入请求重定向到 CGI 应用程序。如果找不到请求的文件,我现在需要让应用程序返回 404。我怎样才能从我的程序中解决这个问题?发送的第一行是内容类型,而它之前的行通常表示状态(200/404/500 等)。
当您通过基本身份验证页面登录时,您身份验证的用户名是否存储在任何地方(在服务器或客户端计算机上),可能在环境变量中?
背景:我有一个用于电子邮件服务器的通用 Web 管理页面,我想知道谁在做什么。当用户通过基本身份验证成功登录时,我希望能够识别他们并记录他们的操作。所以每次提交请求时,我都可以写入日志文件。基本格式是:
$username ran a $function against $useraccount
Run Code Online (Sandbox Code Playgroud)
因此,如果用户更改了某人的权限,例如:
Admin-Bob ran a permission change against User-Scott
Run Code Online (Sandbox Code Playgroud)
因此,如果发生错误,我可以轻松地在日志文件中追溯导致原因的操作。我尝试检查%ENV哈希无济于事,有什么想法吗?
我真的不想进入类似 PHP 的会话,因为这意味着取消我的基本身份验证,这已经给了我很好的控制程度。如果我必须用会话编码一些东西,我需要实现一个系统来在最大尝试后阻止用户等等,我真的不想编码。我认为这更适合于 serverfault,因为它更适合 Apache 而不是编程语言。会议可以用多种语言完成。
我正在运行Debian 6.0.3( squeeze), nginx-0.7.67, fcgiwrap-1.0-1+squeeze1. 这是测试脚本:
#!/usr/bin/perl
use 5.010;
use warnings;
use strict;
use Data::Dumper;
print "Content-Type: text/html\n\n";
say Dumper {map {$_ => $ENV{$_}} 'SCRIPT_NAME', 'DOCUMENT_ROOT', 'WHATEVER'};
say "$<, $>, $(, $)";
Run Code Online (Sandbox Code Playgroud)
这是nginx配置:
server {
server_name domain.com;
root /home/yuri/6;
access_log /var/log/nginx/domain.com-access.log;
error_log /var/log/nginx/domain.com-error.log;
location /cgi-bin/ {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param DOCUMENT_ROOT /home/yuri/7/;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param WHATEVER 1;
fastcgi_param WHATEVER 2;
}
location /1.php {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param PHP_ADMIN_VALUE cgi.fix_pathinfo=1;
fastcgi_param …Run Code Online (Sandbox Code Playgroud) 我的 CGI Perl 脚本 CentOS 7 运行不正确,它们要么显示为纯文本,要么出现服务器错误。
我一直把我的脚本放在默认/var/www/cgi-bin目录中,但没有运气。
我试图将 CGI 脚本放入其中,/var/www/html/another-dir但它们只是作为纯文本出现。
当我在 Apache 下运行 cgi 脚本时,任何输出都会快速发送到客户端。但是,当我使用 fcgiwrap 在 nginx 下运行它时,在脚本完成或产生大量输出之前,似乎没有任何内容发送到客户端。特别是在使用 git-http-backend 时,这会导致克隆大型存储库时的网关超时(并且缺乏克隆较小存储库的进度信息)。
可以使用以下脚本查看此行为。
#!/bin/bash
echo "Content-type: text/html"
echo
while :
do
echo this is a test.
sleep 5
done
Run Code Online (Sandbox Code Playgroud)
在 apache 下,客户端将每 5 秒获取一些数据。
在带有 fcgiwrap 的 nginx 下,我没有得到任何数据和网关超时。
nginx 和 fcgiwrap 是来自 Debian Jessie 的软件包。版本 1.1.0-5 和 1.6.2-5+deb8u4
所以问题
来自维基百科上的代理服务器:
\n\n\n代理服务器可以驻留在用户的本地计算机上,或者位于用户计算机和 Internet 上的目标服务器之间的任意点。传递未修改的请求和响应的代理服务器通常称为网关,有时也称为隧道代理。转发代理是面向 Internet 的代理,用于从各种来源(大多数情况下是 Internet 上的任何位置)检索数据。反向代理通常是面向内部的代理,用作前端来控制和保护对专用网络上服务器的访问。反向代理通常还执行负载平衡、身份验证、解密和缓存等任务。
\n
来自David Gourley 和 Brian Totty 的HTTP:权威指南:
\n\n严格来说,代理连接两个或多个使用相同协议的应用程序,而网关则连接两个或多个使用不同协议的应用程序。网关充当\xe2\x80\x9c协议转换器,\xe2\x80\x9d\n允许客户端完成与服务器的事务,即使客户端和服务器使用不同的协议。
\n图 6-2 说明了代理和网关之间的区别:
\n\n
\n- \n
图 6-2a 中的中间设备是 HTTP 代理,因为代理与客户端和服务器都使用 HTTP 协议。
\n- \n
图 6-2b 中的中间设备是 HTTP/POP 网关,\n因为它将 HTTP 前端与 POP 电子邮件后端联系在一起。网关\n将 Web 事务转换为适当的 POP 事务,\n以允许用户通过 HTTP 读取电子邮件。基于网络的电子邮件程序\n例如 Yahoo! Mail 和 MSN Hotmail 是 HTTP 电子邮件网关。
\n实际上,代理和网关之间的区别很模糊。\n由于浏览器和服务器实现不同版本的 HTTP,\n代理通常会执行一定量的协议转换。商业代理服务器实现网关功能以支持 SSL 安全协议、SOCKS 防火墙、FTP 访问和基于 Web …
我有一个默认的 Apache 2.2 系统设置,其中有一个 Perl CGI 脚本目录,配置如下:
ScriptAlias /jarvis/ "/opt/jarvis/cgi-bin/"
Run Code Online (Sandbox Code Playgroud)
除了我的一个脚本需要 10 多分钟来处理之外,这里没有什么特别的,并且由于各种原因,在此期间没有打印任何内容。
Apache 似乎有 10 分钟(600 秒)的时间范围来运行 CGI 脚本 - 如果在此时间范围内脚本没有出现任何输出,则脚本将被终止,并向浏览器/客户端发送 500 响应。
消息:
[Thu Apr 23 13:57:53 2009] [warn] [client 127.0.0.1] Timeout waiting for output from CGI script /opt/jarvis/cgi-bin/jarvis.pl
Run Code Online (Sandbox Code Playgroud)
出现在一个系统(Ubuntu,通过 apt-get 安装)的日志中,但不会出现在另一个系统(Windows,通过包下载安装)上。
我的问题是 - Apache 2.2 中是否有任何配置可以让我运行脚本超过 10 分钟而不会被杀死?
编辑
定期写入日志消息可以避免此错误 - 因此每隔几分钟写入一次日志消息可确保长时间运行的进程不会被终止。我最终通过在客户端上实现一个进度条并让我的脚本编写一个“.”来解决我的问题。每隔一段时间更新另一端的栏。
谢谢,杰米
我知道这不是 TFTP 的目的,但我在一个环境中工作,在这种环境中,许多不同类型的设备从 TFTP 服务器中提取配置信息。我正在开发的是一个用于跟踪和维护设备配置的供应系统,我希望能够即时生成请求的文件,就像您可以使用任何 Web 应用程序一样。
是的,其中一些设备可以支持 HTTP 进行配置,但并非所有设备都支持,我们希望事情保持一致。
是否有任何 TFTP 守护进程可以提供类似于 CGI 的功能?
我有一个相当资源密集型的 CGI,需要很长时间才能开始发送数据。我们已经看到很多不耐烦的人重新加载几次的情况,然后触发要加载的 CGI 的额外运行,或者客户端超时并断开连接但 CGI 继续运行的情况。
有什么好的方法可以检测何时发生这种情况?它甚至不需要在 CGI 本身中(如果不是,可能会更好——它交给我无法控制的另一个程序),但可能是一个经常运行的 cron 作业寻找死的连接来收获。
我目前正在使用 Apache,但这是一个问题,如果它有处理它的规定(或让我监视问题的方法),我愿意运行其他一些网络服务器。
问题:我有一个脚本,它以 root 身份通过 cron 作业定期运行,但我想给人们一种通过网页异步启动它的方法。(将编写脚本以确保它不会运行重叠实例等。)
我不需要用户登录或拥有帐户,他们只需单击一个按钮,如果脚本准备好运行,它就会运行。用户可以为脚本选择参数(作为输入进行了大量过滤),但为简单起见,我们会说他们只有选择按下的按钮。
作为一个简单的测试,我在 cgi-bin 中创建了一个 Python 脚本。chown-ing 到 root:root 然后对它应用 "chmod ug+" 没有得到预期的结果:它仍然认为它具有网络服务器帐户的有效组......据我所知,这不是允许。
我读到用编译的 cgi 程序包装它可以完成这项工作,所以我创建了一个 C 包装器来调用我的脚本(它的权限恢复到正常)并给可执行文件根权限和 setuid 位。那行得通……脚本运行起来就像 root 运行它一样。
我的主要问题是,这是否正常(需要二进制包装器来完成工作),这是安全的方法吗?它不是面向世界的,但我仍然想学习最佳实践。
更广泛地说,我经常想知道为什么编译后的二进制文件在实践中比脚本更“可信”?我认为你会信任一个人类可读的文件,而不是一个神秘的二进制文件。如果攻击者可以编辑文件,那么您就已经有麻烦了,如果是您无法轻松检查的文件,则更是如此。简而言之,我希望它在此基础上反过来。你的意见?