我正在整理一个写入数据库的小型Web应用程序(Perl CGI和MySQL).CGI脚本从表单中获取一些信息并将其写入数据库.但是,我注意到,如果我在网络浏览器上点击"重新加载"或"返回",它会再次将数据写入数据库.我不想要这个.
在这种情况下,防止重写数据的最佳方法是什么?
使用Apache 2,我想配置我的网站,以便将对该域的任何请求转发到Python CGI脚本。基本上,如果用户访问http://www.example.com,我希望执行cgi /cgi-bin/cgi.py。如果用户转到http://www.example.com/index.rss,我希望/cgi-bin/cgi.py以/index.rss作为参数执行。我尝试了ScriptAlias和Rewrite的各种组合,但似乎无法使其处于正确的关系中。
我有一个非常奇怪的问题..我真的希望有人有答案,因为我不知道还有什么要问的.
我正在用C++编写一个cgi应用程序,它由Apache执行并输出HTML代码.我自己压缩HTML输出 - 从我的C++应用程序中 - 因为我的Web主机由于某种原因不支持mod_deflate.
我用Firefox 2,Firefox 3,Opera 9,Opera 10,谷歌Chrome,Safari,IE6,IE7,IE8,甚至wget测试了它.除了IE8之外,它适用于任何东西.
IE8只是说"Internet Explorer无法显示网页",没有任何信息.我知道这是因为压缩只是因为它可以工作,如果我禁用它.
你知道我做错了什么吗?
我使用zlib来压缩它,确切的代码是:
/* Compress it */
int compressed_output_size = content.length() + (content.length() * 0.2) + 16;
char *compressed_output = (char *)Alloc(compressed_output_size);
int compressed_output_length;
Compress(compressed_output, compressed_output_size, (void *)content.c_str(), content.length(), &compressed_output_length);
/* Send the compressed header */
cout << "Content-Encoding: deflate\r\n";
cout << boost::format("Content-Length: %d\r\n") % compressed_output_length;
cgiHeaderContentType("text/html");
cout.write(compressed_output, compressed_output_length);
static void Compress(void *to, size_t to_size, void *from, size_t from_size, int *final_size)
{
int ret;
z_stream stream; …Run Code Online (Sandbox Code Playgroud) 我有这个Perl脚本位于我的Apache服务器的cgi-bin文件夹中:
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
print "Content-type: text/html\r\n\r\n";
print "Hello there!<br />\nJust testing .<br />\n";
my $top = 5;
foreach (1..$top) {
print "i = $_<br />\n";
sleep 1;
}
Run Code Online (Sandbox Code Playgroud)
我想在这里实现的是逐步更新网页以向用户显示更新状态.然而,我实际上得到的是在延迟5秒之后的整个输出.
有什么办法可以编写一个能够不断告知用户进度的脚本吗?我有一个脚本需要很长时间才能完成,我希望能够实时看到它的进度而不是完整的脚本.
我也尝试将autoflush模式设置为off($ | = 0),但即便如此也没有做任何事情.
我需要在我的CGI脚本中获取远程用户名.我在哪里找到的?我想在我返回的页面上显示该名称.
如何在没有apache的情况下运行我的perl CGI脚本?这是出于测试目的,因此某种只处理一个请求的单进程服务器对我来说应该足够了.
我计划在我的网站上添加一个更好的搜索功能,所以我认为我会用C语言编写它并使用CGI作为访问它的方法.但就基于CGI的东西而言,Perl似乎是最受欢迎的语言.这是为什么?用C或机器代码编程是不是更快?
如果有的话,用脚本语言编写它有什么好处?
谢谢.
我正在尝试在CGI中提供文件上传的实时解析,并在屏幕上显示数据.
但是,Apache2似乎想要在完全发送CGI应用程序之前等待完整的POST完成.
如何强制Apache2停止缓冲POST到我的CGI应用程序?
编辑
看起来它实际上是被缓冲的CGI的输出.我开始将数据流式传输到临时文件以观察其进度.那,我有另一个问题.
1)输出正在缓冲.我已经尝试了SetEnvIf(简称SetEnv)用于"!nogzip","nogzip"和"!gzip"但没有成功(在CGI目录定义中).
2)在CGI进程退出之前,Apache2似乎没有读取CGI的输出?我注意到我的CGI应用程序(正在刷新与否)在80K左右的"fwrite(...,stdout)"行上永久挂起.
编辑
好吧,Firefox正在搞乱我.如果我发送150K文件,那么80K左右就没有CGI锁定.如果文件是2G,则有一个锁定.因此,Firefox在尝试发送文件时没有从服务器读取输出...是否有任何标题或备用内容类型来更改该行为?
编辑
好吧,我想大文件上的CGI输出锁定实际上并不重要.我不需要回显文件!我正在调试由调试辅助工具引起的问题.:)
我想这个效果还不错.谢谢!
最后的说明
就像一个注释......我认为Apache2缓冲输入的原因是我总是得到一个"Content-Length"环境变量.我猜FireFox足够聪明,可以预先计算多部分表单上传的内容长度,而Apache2正在传递它.我认为Apache2正在缓冲输入并报告长度本身.
我有一些Perl CGI代码,我试图在SourceForge帐户的项目Web空间中运行.在与IE交谈时,代码能够很好地设置浏览器cookie,但在与Firefox交谈时没有设置cookie .当我在"localhost"上使用Apache进行测试时,两个浏览器都能正常工作.它只在Firefox疯狂的远程SourceForge URL上.
搜索已经发现了几十个近乎重复的问题,但通常人们会遇到完全相反的问题!(Firefox很好,IE有问题)
这是我要求设置cookie的实用程序子:
sub setCookie {
my $name = shift;
my $value = shift;
my $expires = shift;
my $path = shift;
my $domain = shift;
if( !defined( $expires ) ) {
$expires = '+4h';
}
if( !defined( $path ) ) {
$path = '/';
}
if( !defined( $domain ) ) {
$domain = 'steveperkins.sourceforge.net';
}
my $cookie = CGI::cookie(
-name => $name,
-value => $value,
-domain => $domain,
-expies => $expires,
-path …Run Code Online (Sandbox Code Playgroud) 当我执行"ps -ef | grep port"时,我收到以下消息
apache 6215 1 0 11:20 ? 00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8
Run Code Online (Sandbox Code Playgroud)
有没有办法解析以下内容:
cgi ×10
perl ×6
apache ×4
apache2 ×2
bash ×1
c++ ×1
compression ×1
cookies ×1
database ×1
forms ×1
grep ×1
idempotent ×1
linux ×1
mason ×1
mod-rewrite ×1
performance ×1
post ×1
search ×1
shell ×1