webForumDet fria alternativet

Countlink

23 svar · 495 visningar · startad av Hazze

HazzeMedlem sedan jan. 20001 891 inlägg
#1

Hejsan!
Jag behöver verkligen hjälp nu. Jag har laddat hem ett sorts statistik som mäter hur många som klickar på en länk osv. Så här ser koden ut:

<#!/wwwapps/perl/bin/perl.exe
#/usr/bin/perl

# This is the total counter log filename
$Counter = '/clients/sks/wwwroot/scripts/countlink.log';

##########################################################
# No changes need to be made after these lines
##########################################################
$link = $ENV{'QUERY_STRING'};

# Add hit to main counter
open (CNT,"+<$Counter") &#0124; &#0124; &endIt;
flock (CNT,2); seek (CNT,0,0);
@infile = <CNT>;

# This will put the hits in order from max to min for each file added
$record = 0;		# Starting record in the log is always 0
$correctspot = 'N';	# Tells script if this record is the one that was hit

# Proceeds as long as the record number is less than the total 
# number of records in the file and the correct record hasn't been found yet.
while (($correctspot eq 'N') && ($record <= $#infile))  
{ ($count,$linkname,$eol) = split(/\|/,$infile[$record]);
  if ($linkname eq $link)  #if this is the right record, hit it, trip correctspot
    {$count++;
    $infile[$record] = join ("\|",$count,$linkname,"\n");
    $correctspot = 'Y';
    }
  $record++;
}
if ($correctspot eq 'N')
{ $count = 1;
  $newrecord = join ("\|",$count,$link,"\n");
  push @infile, $newrecord;
}

@outfile = sort {($b =~ /(\d+)/)[0] <=> ($a =~ /(\d+)/)[0]} @infile;

seek (CNT,0,0);
print (CNT @outfile);
truncate (CNT,tell(CNT));
close (CNT);
#############
	print "Content-type: text/html\n";
	print "Location: <A HREF="http://$link\n\n";" TARGET=_blank>http://$link\n\n";</A> 

sub endIt # exit on error
{ exit;
} # end endIt

Den ser väl ganska rätt ut.
Om allt ska fungera så ska man kunna skriva länkar på detta sätt: www.sks.nu/scripts/countlink.cgi&www.webforum.nu och mitt besök till webforum kommer läggas till i en logfil. Men det fungerar inte. Felmeddelandet blir så här: CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

----
Hoppas att någon kan hjälpa mig. Rättare sagt, jag ber för att nån kan hjälpa mig ;)

------------------
//
<title>Hazze</title>

emissionMedlem sedan dec. 19996 095 inlägg
#2

Första raden...

<#!/wwwapps/perl/bin/perl.exe

Skippa <-tecknet

Utgår från att det körs på en Windowsburk

HazzeMedlem sedan jan. 20001 891 inlägg
#3

Tyvärr det hjälpe inte :(
Något annat förslag?

------------------
//
<title>Hazze</title>

emissionMedlem sedan dec. 19996 095 inlägg
#4

Kör skriptet från kommandoprompten, så kan du se om det finns några direkta fel i det.

[Redigerat av emission den 07 jun 2000]

RobbanMedlem sedan dec. 19992 272 inlägg
#5

Prova med att lägga till följande rad någonstans i början (inte före sökvägen till perl dock):

use CGI::Carp qw(fatalsToBrowser);

Vad den raden gör är att ladda en modul som försöker skicka eventuella felmeddelanden till webläsaren (och inte bara till felloggen som är det vanliga).

------------------
Robban < robban@lipogram.com >

HeHoMedlem sedan apr. 2000163 inlägg
#6

Jag är rätt så ny på detta men vad jag har fått lära mej så är det väldigt viktigt att raden som skriver ut HTTP huvudet alltid innehåller två radmatningar så här:
print "Content-type: text/html\n\n";
och det gör ju inte "din".

RobbanMedlem sedan dec. 19992 272 inlägg
#7

... vad jag har fått lära mej så är det väldigt viktigt att raden som skriver ut HTTP huvudet alltid innehåller två radmatningar ...

Japp. Eller snarare; HTTP-huvudet och själva sidinnehållet skall vara åtskiljda av en tomrad.

Men det har vi ju här. Det sista som skrivs ut i HTTP-huvudet är raden som börjar med Location: ..., och den raden avslutas med en extra radmatning. :)

------------------
Robban < robban@lipogram.com >

[Redigerat av Robban den 08 jun 2000]

HeHoMedlem sedan apr. 2000163 inlägg
#8

Jaha :r Location hör till HTTP-huvudet.
Jag lär mig nått nytt varje dag. Vad gör Location då? Använder den sig av en befintlig webbsida eller?

emissionMedlem sedan dec. 19996 095 inlägg
#9

Location beskriver vart webbläsaren ska, och ger samma resultat som response.redirect i ASP (som skriver ut just en location-header).

Här föregås den av content-type, vilket är lite lustigt, och kanske ger upphov till fel.

RobbanMedlem sedan dec. 19992 272 inlägg
#10

Här föregås den av content-type, vilket är lite lustigt, och kanske ger upphov till fel.

Det är inte fel enligt HTTP-protokollet:

The new URL must be given by the Location field in the response. Unless it was a HEAD request, the Entity-Body of the response should contain a short note with a hyperlink to the new URL.

Och när svaret innehåller en "entity-body" så skall en content-type finnas med.

Men jag håller med dig om att man prova med att to bort den. Eller byta ordning så att location kommer först (osäker på om det har någon betydelse, men nu när jag tänker efter så har jag fått för mig att location bör skrivas före en eventuell content-type).

Följande bör vara ett korrekt svar om jag tolkat HTTP-protokollet rätt:

print "Location: <A HREF="http://foo.com/page.html\n";" TARGET=_blank>http://foo.com/page.html\n";</A>  
print "Content-type: text/html\n\n";
print "Sidan flyttad till <a href="">http://foo.com/page.html</a>.

------------------
Robban < robban@lipogram.com >

[Redigerat av Robban den 08 jun 2000]

RobbanMedlem sedan dec. 19992 272 inlägg
#11

Varför går det inte att redigera inlägget om det innehåller ett kod-avsnitt? :(

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Perl-kod:<pre>print "Location: <A HREF="http://foo.com/page.html\\n";" TARGET=_blank>http://foo.com/page.html\\n";</A>
print "Content-type: text/html\n\n";
print "Sidan flyttad till <a href=\"http://foo.com/page.html\\">http://foo.com/page.html\</a>.

------------------
Robban < robban@lipogram.com >

[Redigerat av Robban den 08 jun 2000]

emissionMedlem sedan dec. 19996 095 inlägg
#12

The new URL must be given by the Location field in the response. Unless it was a HEAD request, the Entity-Body of the response should contain a short note with a hyperlink to the new URL.

Men det är ju bara intressant vid status 301,302 och 303. Det här är ju nästan status 301, men ändå inte... Det normala är att man endast skriver ut en location-header.

PS. Det går väl alldeles utmärkt att redigera "kod-inlägg"? .DS

RobbanMedlem sedan dec. 19992 272 inlägg
#13

De flesta webservrar petar in en egen content-type så det spelar oftast ingen roll. Men det är alltså helt korrekt att ha med en.

Detta är vad Apache svarar om man enbart har en location:

HTTP/1.1 302 Found
Date: Thu, 08 Jun 2000 10:19:34 GMT
Server: Apache/1.3.6 (Unix) PHP/3.0.7 mod_ssl/2.2.8 OpenSSL/0.9.2b
Location: [url="http://lipogram.com/index.html"]http://lipogram.com/index.html[/url] 
Transfer-Encoding: chunked
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>302 Found</TITLE>
</HEAD><BODY>
<H1>Found</H1>
The document has moved <A HREF="http://lipogram.com/index.html">here</A>.<P>
</BODY></HTML>

Men det finns inget som hindrar att man bidrar med eget innehåll.

Det normala är att man endast skriver ut en location-header.

Det "normala" (i meningen vanligaste) var innan årsskiftet att många behandlade årtalet man fick från localtime() på följande sätt:

if ($year > 90) { $year = "19".$year }
else { $year = "20".$year }

Men så såg vi också hur många sidor som helst med årtalet "19100" efter årsskiftet. ;)

------------------
Robban < robban@lipogram.com >

RobbanMedlem sedan dec. 19992 272 inlägg
#14

Det går väl alldeles utmärkt att redigera "kod-inlägg"?

Nja, om du trycker på "editera-knappen" för det långa inlägget jag skrev 10:56 så ser du att inte hela inlägget kommer med i textrutan. Så blir det för mig i.a.f. (har råkat ut för det en gång förut). Testa gärna så att det inte bara är mig det blir fel för (är det ett generellt fel får vi väl kontakta Kjell).

------------------
Robban < robban@lipogram.com >

emissionMedlem sedan dec. 19996 095 inlägg
#15

Där ser man...lustigt.

Rätt om headern förresten, borde ha testat.... :)

HazzeMedlem sedan jan. 20001 891 inlägg
#16

Det fungerar fortfarande inte. Trots att jag lade till denna raden i början av scriptet: use CGI::Carp qw(fatalsToBrowser);
Jag vet att det inte är något fel på scriptet eftersom jag har sett att det fungerar på andra sidor. T.ex www.dualconsole.nu på deras annonser.
Emission: Vad är en kommandoprompt?

------------------
//
<title>Hazze</title>

emissionMedlem sedan dec. 19996 095 inlägg
#17

"DOS-prompten", "kommandotolken"....

RobbanMedlem sedan dec. 19992 272 inlägg
#18

Ok, då skall vi se. Eftersom det är en NT-server stämmer inte följande rad:

$Counter = '/clients/sks/wwwroot/scripts/countlink.log';

Sökvägar på NT börjar alltid med en enhetsbokstav, typ:

$Counter = 'C:/clients/sks/wwwroot/scripts/countlink.log';

På det sätt som filen öppnas skapas dessutom inte logfilen om den inte existerar. Detta innebär att den redan måste existera när scriptet körs, annars lyckas inte filöppningen och scriptet avslutas.

------------------
Robban < robban@lipogram.com >

HazzeMedlem sedan jan. 20001 891 inlägg
#19

Tyväär, det går inte :(
Jag försötår mig inte på felmeddelandet som kommer:
CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

------------------
//
<title>Hazze</title>

emissionMedlem sedan dec. 19996 095 inlägg
#20

Jag upprepar. Kör programmet från kommandotolken.....

Genererad på 370 ms · cache AV · v20260730165559-full.f96bc7eb