Toon posts:

[Opera] voorkomen dat pagina in cache van opera komt

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een bepaalde website die nog in de testfase zit heb ik een bepaalde oplossing die betaalde toegang tot een website afhandelt. Deze werkt wel in FF/IE maar niet in Opera. Ik ben er inmiddels achter dat het komt doordat Opera de pagina in de cache zet, waardoor de oplossing alleen de eerste keer correct werkt. De tweede keer haalt Opera de pagina uit cache waardoor de zaak fout loopt en de bezoeker geen toegang krijgt terwijl deze hier wel recht toe heeft.

Wat ik nu dus wil doen is voorkomen dat bepaalde pagina's in de cache van opera terechtkomen. Het gaat om zowel een html als een php pagina. De html pagina betreft een frameset waarin de php-pagina inzit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Toegang tot alle films en foto's!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset rows="0,*"" frameborder="NO" border="0" framespacing="0">
  <frame src="check.php" name="top">
  <frame src="index2.htm" name="main">
</frameset>
</script>
<noframes><body>
</body></noframes>
</html>


De php-pagina kijkt of de gebruiker nog toegang heeft en ziet er zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?
error_reporting(E_ALL);
$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
$htaccess_file   = '.htaccess';  // .htaccess file 
set_time_limit(0);

// Controleren of ip nog toegang heeft
function IPCheck($ip) {
    global $htaccess_file;
    
    if($htaccess_file=='') 
        return true;
        
    $ip_allowed= strtolower(join(' ',file($htaccess_file)));
    $ip_okay   = strpos($ip_allowed, "allow from $ip") ? 1:0;
    return $ip_okay;
}

//kijken of ip uberhaupt toegang heeft
$okay      =IPCheck($REMOTE_ADDR);

while($okay)
{
    if($htaccess_file && (time()!=$last_time))
    {
        //Elke seconde controleren
        $last_time=time();
        $okay=IPCheck($REMOTE_ADDR);
    }    
    if($okay == 0)
    {
    
        echo "<script>window.parent.location='../verbroken.php';</script>";
    }
}
?>
</body>
</html>


Het probleem is dus dat beide pagina's in de cache van Opera terechtkomen. Opera haalt dan wanneer dezelfde bezoeker voor de tweede keer de pagina bezoekt de pagina uit de cache waarbij de bezoeker geen toegang meer heeft. Hierdoor heeft de bezoeker bij een tweede bezoek dus direct geen toegang en gaat meteen naar 'verbroken.php' (tenzij tussendoor de cache is leeggegooid, maar goed daar mag je niet vanuit gaan natuurlijk).

Dus hoe voorkom ik nou dat de pagina's gecached worden, zodat de check altijd goed gaat?

Ik heb:
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
en
<META HTTP-EQUIV="expires" CONTENT="Tue, 31 Dec 2003 23:00:00 GMT"> (zomaar een datum in het verleden genomen)
al geprobeerd maar deze geven niet het gewenste resultaat. Ik krijg dan zelfs een hele witte pagina te zien bij een tweede bezoek.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:00

crisp

Devver

Pixelated

Meta http-equivalents zijn mosterd na de maaltijd. Caching-headers specificeer je op HTTP niveau. PHP biedt je gewoon mogelijkheden om headers te definieëren mbv de header() functie.

Intentionally left blank


  • t-x-m
  • Registratie: November 2003
  • Laatst online: 05-01 18:35

t-x-m

.NET Nerd

PHP:
1
2
3
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");

[ Voor 36% gewijzigd door t-x-m op 23-08-2006 11:40 ]

GC.Collect();


  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Ik vraag me wel af in hoeverre Opera zich eraan houdt. Misschien in v9 standaard wel, maar je kunt O ook zo instellen dat als je een pagina terug gaat, je die meteen op scherm krijgt te zien, zonder reload. Om dat voor elkaar te krijgen zal het toch *ergens* gecachet moeten worden; misschien alleen in RAM en niet op harddisk, dat weet ik niet.

offtopic:
Frames? Alsjeblieft zeg, laat die dingen in de vorige eeuw. En ik heb gemerkt dat sommige mensen/bedrijven met een trunked lijn werken, en dan komt één en dezelfde persoon via meerdere IP-adressen je site op. Zou beetje jammer zijn als dan de helft van de requests geblokkeerd worden vanwege deze situatie.

Verwijderd

Topicstarter
@T-X-M :
Bedankt voor de tip, de oplossing lijkt goed te werken! In ieder geval wanneer ik de default instellingen van Opera heb aanstaan.

@Nexxennium:
Welke instelling bedoel je precies? Ik zit wat te zoeken in de voorkeuren, maar kan niet vinden wat jij bedoelt. Ik zou het graag ook even testen als de door jou bedoelde instelling aanstaat!

Bedankt jongens!

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Verwijderd schreef op woensdag 23 augustus 2006 @ 20:21:
@Nexxennium:
Welke instelling bedoel je precies? Ik zit wat te zoeken in de voorkeuren, maar kan niet vinden wat jij bedoelt. Ik zou het graag ook even testen als de door jou bedoelde instelling aanstaat!
opera:config, History Navigation Mode op 3 zetten. Dan heb je het gedrag van Opera <9 weer terug. Ze hebben het nu aangepast, met als gevolg page loads in sommige gevallen. Daar zit ik niet op te wachten (letterlijk niet :))

Verwijderd

Topicstarter
mmm ik kan het nog steeds niet vinden. Ik werk met Opera 9.00 NL versie. Zou het kunnen dat deze anders is dan jouw versie? Ik zie namelijk bij geschiedenis alleen deze opties:

http://members.chello.nl/~f.bos32/Opera.JPG

Ik heb niet het idee dat het hier tussen staat of mis ik iets?

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Je moet opera:config in de adresbalk typen. Dan krijg je een uitgebreide lijst met instellingen waarvan je een groot deel niet via de gebruikelijke opties kunt instellen. Dat is iets nieuws naar analogie met Firefox (about:config).

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


Verwijderd

mahi schreef op donderdag 24 augustus 2006 @ 09:57:
Dat is iets nieuws naar analogie met Firefox (about:config).
opera:config bestaat al laaaange tijd hoor

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

HTML:
1
2
3
4
5
    if($okay == 0)
    {
    
        echo "<script>window.parent.location='../verbroken.php';</script>";
    }


Jesus, zo doe je toch geen headers!
PHP:
1
header("Location:http://.../verbroken.php");

Going for adventure, lots of sun and a convertible! | GMT-8


Verwijderd

Ik heb ook lang aan dit probleem gesleuteld. In mijn geval ging het om een forum, waar je na het posten een redirect pagina kreeg, en met een META redirect terugverwezen werd naar het topic waar je in gepost had. Probleem in Opera (ik geloof 8 ) was dat het topic idd uit de cache werd gehaald en de post die jij net geplaatst had niet zichtbaar werd.

Ik heb toen van alles geprobeerd met header() en META tags maar het hielp maar weinig.
Uiteindelijk heb ik, om er vanaf te komen, in de doorverwijs URL een variabele gestopt met een random waarde, waardoor Opera dacht dat het een nieuwe pagina was.

Dus als niets meer werkt kun je dat misschien proberen..

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Verwijderd schreef op donderdag 24 augustus 2006 @ 10:00:
opera:config bestaat al laaaange tijd hoor
Die functionaliteit is pas aanwezig sinds Opera 9 waarvan de final amper 2 maanden oud is. Natuurlijk als je beta/preview-gebruiker bent, dan kende je dat natuurlijk al iets langer (sinds begin dit jaar om precies te zijn).

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Verwijderd schreef op donderdag 24 augustus 2006 @ 10:07:
Ik heb ook lang aan dit probleem gesleuteld. In mijn geval ging het om een forum, waar je na het posten een redirect pagina kreeg, en met een META redirect terugverwezen werd naar het topic waar je in gepost had. Probleem in Opera (ik geloof 8 ) was dat het topic idd uit de cache werd gehaald en de post die jij net geplaatst had niet zichtbaar werd.

Ik heb toen van alles geprobeerd met header() en META tags maar het hielp maar weinig.
Uiteindelijk heb ik, om er vanaf te komen, in de doorverwijs URL een variabele gestopt met een random waarde, waardoor Opera dacht dat het een nieuwe pagina was.

Dus als niets meer werkt kun je dat misschien proberen..
Ik gebruik al jaren redirects vanaf een formulier, via een tussenpagina weer terug naar de pagina waar het formulier staat. Dat gaat vlekkeloos in Opera, iig sinds versie 6. Om dat soort redirects nog met <meta>-elementen te doen?.. :X

Verwijderd

Topicstarter
Snake schreef op donderdag 24 augustus 2006 @ 10:03:
HTML:
1
2
3
4
5
    if($okay == 0)
    {
    
        echo "<script>window.parent.location='../verbroken.php';</script>";
    }


Jesus, zo doe je toch geen headers!
PHP:
1
header("Location:http://.../verbroken.php");
Probleem is dat ik niet kan redirecten met de header functie omdat er reeds output verstuurd is. Ik krijg dan de melding 'header already sent enz.'. Ik moet dus wel gebruikmaken van javascript en/of meta refresh.

Verwijderd

Topicstarter
Ik heb even getest met History Navigation Mode op 3, maar de oplossing van T-X-M werkt nog steeds, hartelijk dank dus!

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Verwijderd schreef op vrijdag 25 augustus 2006 @ 10:30:
[...]


Probleem is dat ik niet kan redirecten met de header functie omdat er reeds output verstuurd is. Ik krijg dan de melding 'header already sent enz.'. Ik moet dus wel gebruikmaken van javascript en/of meta refresh.
Ja dan moet je geen output sturen :+

Redirects met meta/javascript is van voor de tweede wereldoorlog. Not done. Zeker niet voor commerciele toepassingen.

Verwijderd

Topicstarter
Ik kan je kritiek wel begrijpen. Eerder heb ik het ook met header geprobeerd, maar ik krijg deze oplossing niet werkend. Ik maak gebruik van de volgende pagina (check.php) het recht op toegang controleert:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Pragma: no-cache"); 

error_reporting(E_ALL);
$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
$htaccess_file   = '.htaccess';  // .htaccess file 
set_time_limit(0);

// Controleren of ip nog toegang heeft
function IPCheck($ip) {
    global $htaccess_file;
    
    if($htaccess_file=='') 
        return true;
        
    $ip_allowed= strtolower(join(' ',file($htaccess_file)));
    $ip_okay   = strpos($ip_allowed, "allow from $ip") ? 1:0;
    return $ip_okay;
}

//kijken of ip uberhaupt toegang heeft
$okay      =IPCheck($REMOTE_ADDR);

while($okay)
{
    if($htaccess_file && (time()!=$last_time))
    {
        //Elke seconde controleren
        $last_time=time();
        $okay=IPCheck($REMOTE_ADDR);
    }    
    if($okay == 0)
    {
        header("location: http://www.mijnpagina.nl/verbroken.php");
    }
}
?>


Deze pagina bevindt zich in het eerste frame van deze pagina:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Toegang tot alle films en foto's!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset rows="0,*"" frameborder="NO" border="0" framespacing="0">
  <frame src="check.php" name="top">
  <frame src="index2.htm" name="main">
</frameset>
</script>
<noframes><body>
</body></noframes>
</html>


In het tweede frame bevindt zich de pagina waarvan de toegang geblokkeerd wordt als check.php constateert dat er geen recht op toegang meer is. Zoals te zien is wordt er geen check.php geen output gestuurd. Als ik bovenstaande oplossing echter draai krijg ik zo gauw check.php de header functie laat uitvoeren toch de melding
Warning: Cannot modify header information - headers already sent by (output started at .../check.php:7)

Ik heb zelf het idee dat dit komt doordat check.php in een frame zit, en dat het frame op zich ook als output gezien wordt. Of heb ik dit verkeerd en is het toch mogelijk om binnen frames gebruik te maken van header (en wel zodanig dat de nieuwe pagina in het hele venster geladen wordt en dus niet binnen het frame waarin de header functie wordt aangeroepen)???

Bedankt!!

Verwijderd

Topicstarter
Ik kan je kritiek wel begrijpen. Eerder heb ik het ook met header geprobeerd, maar ik krijg deze oplossing niet werkend. Ik maak gebruik van de volgende pagina (check.php) het recht op toegang controleert:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Pragma: no-cache"); 

error_reporting(E_ALL);
$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
$htaccess_file   = '.htaccess';  // .htaccess file 
set_time_limit(0);

// Controleren of ip nog toegang heeft
function IPCheck($ip) {
    global $htaccess_file;
    
    if($htaccess_file=='') 
        return true;
        
    $ip_allowed= strtolower(join(' ',file($htaccess_file)));
    $ip_okay   = strpos($ip_allowed, "allow from $ip") ? 1:0;
    return $ip_okay;
}

//kijken of ip uberhaupt toegang heeft
$okay      =IPCheck($REMOTE_ADDR);

while($okay)
{
    if($htaccess_file && (time()!=$last_time))
    {
        //Elke seconde controleren
        $last_time=time();
        $okay=IPCheck($REMOTE_ADDR);
    }    
    if($okay == 0)
    {
        header("location: http://www.mijnpagina.nl/verbroken.php");
    }
}
?>


Deze pagina bevindt zich in het eerste frame van deze pagina:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Toegang tot alle films en foto's!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset rows="0,*"" frameborder="NO" border="0" framespacing="0">
  <frame src="check.php" name="top">
  <frame src="index2.htm" name="main">
</frameset>
</script>
<noframes><body>
</body></noframes>
</html>


In het tweede frame bevindt zich de pagina waarvan de toegang geblokkeerd wordt als check.php constateert dat er geen recht op toegang meer is. Zoals te zien is wordt er geen check.php geen output gestuurd. Als ik bovenstaande oplossing echter draai krijg ik zo gauw check.php de header functie laat uitvoeren toch de melding
Warning: Cannot modify header information - headers already sent by (output started at .../check.php:7)

Ik heb zelf het idee dat dit komt doordat check.php in een frame zit, en dat het frame op zich ook als output gezien wordt. Of heb ik dit verkeerd en is het toch mogelijk om binnen frames gebruik te maken van header (en wel zodanig dat de nieuwe pagina in het hele venster geladen wordt en dus niet binnen het frame waarin de header functie wordt aangeroepen)???

Bedankt!!
Pagina: 1