作者 主題: 關於上一頁網頁過期的問題??  (閱讀 11722 次)

0 會員 與 1 訪客 正在閱讀本文。

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 於: 2004-07-08 15:22 »
當一個php程式action post到另一個程式後,使用者按瀏覽器的上一頁,常常產生"網頁過期"的警告畫面,請問可以控制history不能回上一頁嗎??
或是程式可以控制不出現這個警告畫面??(不改client端cache設定的前提下)

我試過用location.replace(),可是只對href有效,對action post沒有用....

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #1 於: 2004-07-08 16:09 »
www.php.net 上,將header() function 的介紹都看完
你就會解了

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #2 於: 2004-07-08 18:06 »
謝謝 !! 我會努力去拜讀 :D

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #3 於: 2004-07-11 14:46 »
大致上看完後,我嘗試取消cache網頁,於是我在登入的php裡加入:

header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

雖然達到了目的,但是user更新網頁時,瀏覽器會幫user重新輸入資料,
這樣不就沒意義了嗎 ?? (雖然沒cache,但是依然可以使用更新網頁再次輸入上一次的資料)

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #4 於: 2004-07-12 12:53 »
引用
雖然達到了目的,但是user更新網頁時,瀏覽器會幫user重新輸入資料,
這樣不就沒意義了嗎 ?? (雖然沒cache,但是依然可以使用更新網頁再次輸入上一次的資料)


不懂? 能舉例嗎 ?
是指 input type=text 時,會出現提示內容嗎 ?
若是這個是 IE 的功能,只要在
<input type=text AUTOCOMPLETE="OFF" ...>, 就不會出現了

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #5 於: 2004-07-12 16:35 »
我自己的做法是這樣子
login.php  ->顯示login畫面 POST action處理程式也是login.php
當使用者輸入正確密碼登入後
login.php就送回一個header("Location:http://xxx.xxx.xxx/");
將使用者導引至登入後的畫面
如果使用者使用上一頁功能回到上一頁時
就不會出現這個問題了
畫個圖就比較容易了解
(1)login.php(顯示login畫面)-->POST->(2)login.php(回應一個Location header)->重新導向->(3)登入後的歡迎畫面
而一般系統會出現過期都是在(2)產生的
所以(2)送出一個重新導向的header導致使用者在(3)按上一頁是回不到(2)的
會直接回到(1)就可以避免掉這個問題了
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #6 於: 2004-07-12 21:20 »
1.autocomplete=off好像是自動填入 ??
2.我原本就是用ricky兄所說的架構寫的...

首先我先正確的登入,然後登出,接下去開始測試是否可以利用"上一頁"來重新登入...

雖然回不了上一頁,但是在這裡面卻可以.




當我回到使用者登入時,果然過期了,但.....如果我按下重新整理...



就,.....就.....重新送出我原本key入的帳號和密碼了:(

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #7 於: 2004-07-12 22:08 »
你可能還是沒看清楚喔
(1)login.php(顯示login畫面)-->POST->(2)login.php(回應一個Location header)->重新導向->(3)登入後的歡迎畫面
而一般系統會出現過期都是在(2)產生的
所以(2)送出一個重新導向的header導致使用者在(3)按上一頁是回不到(2)的
在(1)送出資料後Action"是自己本身"也就是login.php
然後在login.php裡面regist session再來就直接回應header redirect
就不會回到login.php了
看來你可能是直接以login.php做回應就會出現網頁過期的訊息了
如果login成功login.php是只有回應header而已不會有html code
就不會有網頁過期的問題了
可以參考一下我的網頁吧http://ez2.us/
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #8 於: 2004-07-13 10:03 »
我也很混淆,我把我的原始code貼上來,請您幫我看看哪裡錯了 :(
代碼: [選擇]
<?session_start();
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");


session_register("memid");
session_register("nameid");
session_register("keyid");

include "config.php";
include "css.php";

// ----- 密碼提取 ----- //
$passcheck = "SELECT mem_id,mem_pas,mem_key,mem_name FROM $db_table_member";
$result_pas=mysql_query($passcheck,$link_ID);
$pas_index=mysql_num_rows($result_pas);

if ($usr_t && $pas_t)
{
    for ($i=0;$i<$pas_index;$i++)
{
$passck[$i]=mysql_fetch_array($result_pas);

if ($passck[$i][mem_id]==$usr_t and $passck[$i][mem_pas]==$pas_t)
 {
  $keyid=$passck[$i][mem_key];
  $memid=$passck[$i][mem_id];
  $nameid=$passck[$i][mem_name];  
}
}
?>

<html>
<head><title>使用者登入</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">



<script language="JavaScript">
<!-- Hide

function setfocus() {
        document.first.usr_t.focus();
        return;
}

// -->
</script>

</head>
<body  link="#0000FF" vlink="#0000FF" text="#CCFFFF" onLoad="setfocus()"  bgcolor="<?echo $bgcolor_main?>">

<table border="0">
<tr>
<td height="25">
</td>
</tr>
</table>



<div align="center">
<form action="<?echo $PHP_SELF?>" method="post" name="first">


<table width="220" cellspacing="2" cellpadding="5" align="center" border="2">
<tr>
<td class="bg2" height="23" align="left" colspan="2">
請輸入帳號及密碼
</td>
</tr>

<tr>
<td class="block1" valign="top" align="center">

帳 號: <input type="text" size="20" name="usr_t" class="block5" value="<?echo $usr_t?>"><br><br>
密 碼: <input type="password" size="20" name="pas_t" class="block5"><br><br>
<div align="center"><input type="submit" value="登入" class="Fontsize"></div>

</td>
</tr>

</table>


<br>

</form>






<?
if ($usr_t && $pas_t)
{

if ($keyid && $memid && $nameid)
 {
echo "<font color='yellow' class='FontSize18'>請稍後, 登入中...</font><br><br>";
echo "<meta http-equiv='refresh' content='1;URL=index.html'>";
 }
else
 {
  echo "<font color='yellow' class='FontSize18'>帳號密碼錯誤!!</font>";
 }
}
?>

</div>
</body>
</html>

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #9 於: 2004-07-13 11:50 »
問題就出在...
你的程式碼有回應html所以就會出現網頁過期訊息啦...
避免的方法就是"不要送出html"
直接回應一個header導向另一個網頁
就不會出現這個問題了
"因為header不屬於html的一部分"
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #10 於: 2004-07-13 11:59 »
改成這樣試看看吧
引述: "joeyhsy"
我也很混淆,我把我的原始code貼上來,請您幫我看看哪裡錯了 :(
代碼: [選擇]
<?session_start();
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");


session_register("memid");
session_register("nameid");
session_register("keyid");

include "config.php";
include "css.php";

// ----- 密碼提取 ----- //
$passcheck = "SELECT mem_id,mem_pas,mem_key,mem_name FROM $db_table_member";
$result_pas=mysql_query($passcheck,$link_ID);
$pas_index=mysql_num_rows($result_pas);

if ($usr_t && $pas_t)
{
    for ($i=0;$i<$pas_index;$i++)
{
$passck[$i]=mysql_fetch_array($result_pas);

if ($passck[$i][mem_id]==$usr_t and $passck[$i][mem_pas]==$pas_t)
 {
  $keyid=$passck[$i][mem_key];
  $memid=$passck[$i][mem_id];
  $nameid=$passck[$i][mem_name];  
}
}
if(!($usr_t && $pas_t))
{
?>

<html>
<head><title>使用者登入</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">



<script language="JavaScript">
<!-- Hide

function setfocus() {
        document.first.usr_t.focus();
        return;
}

// -->
</script>

</head>
<body  link="#0000FF" vlink="#0000FF" text="#CCFFFF" onLoad="setfocus()"  bgcolor="<?echo $bgcolor_main?>">

<table border="0">
<tr>
<td height="25">
</td>
</tr>
</table>



<div align="center">
<form action="<?echo $PHP_SELF?>" method="post" name="first">


<table width="220" cellspacing="2" cellpadding="5" align="center" border="2">
<tr>
<td class="bg2" height="23" align="left" colspan="2">
請輸入帳號及密碼
</td>
</tr>

<tr>
<td class="block1" valign="top" align="center">

帳 號: <input type="text" size="20" name="usr_t" class="block5" value="<?echo $usr_t?>"><br><br>
密 碼: <input type="password" size="20" name="pas_t" class="block5"><br><br>
<div align="center"><input type="submit" value="登入" class="Fontsize"></div>

</td>
</tr>

</table>


<br>

</form>






<?
}
if ($usr_t && $pas_t)
{

if ($keyid && $memid && $nameid)
 {
                    header("Location:index.html");
                    die;    //<<-----送出header之後就停啦別再送出html
 }
else
 {
  echo "<font color='yellow' class='FontSize18'>帳號密碼錯誤!!</font>";
 }
}
if(! ($usr_t && $pas_t))
{

?>

</div>
</body>
</html>
<?
}
?>
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #11 於: 2004-07-13 13:07 »
我試了許久,都會headers already sent....

不知道header在哪裡先被送出,我嘗試把最下面您幫我修改的部份移到上方,也是不行,找不到呢....會不會是session的問題 ??

代碼: [選擇]

<?session_start();
// HTTP/1.1
//header("Cache-Control: no-store, no-cache, must-revalidate");
//header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
//header("Pragma: no-cache");
// Date in the past
//header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
//header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");



session_register("memid");
session_register("nameid");
session_register("keyid");

include "config.php";


// ----- 密碼提取 ----- //
$passcheck = "SELECT mem_id,mem_pas,mem_key,mem_name FROM $db_table_member";
$result_pas=mysql_query($passcheck,$link_ID);
$pas_index=mysql_num_rows($result_pas);

if ($usr_t && $pas_t)
{
    for ($i=0;$i<$pas_index;$i++)
{
$passck[$i]=mysql_fetch_array($result_pas);

if ($passck[$i][mem_id]==$usr_t and $passck[$i][mem_pas]==$pas_t)
 {
  $keyid=$passck[$i][mem_key];
  $memid=$passck[$i][mem_id];
  $nameid=$passck[$i][mem_name];
}
}
?>

<?
if ($usr_t && $pas_t)
{

if ($keyid && $memid && $nameid)
 {
                    header("Location:index.html");
                    die;    
//echo "<font color='yellow' class='FontSize18'>請稍後, 登入中...</font><br><br>";
//echo "<meta http-equiv='refresh' content='1;URL=index.html'>";
 }

}
include "css.php";
?>


<html>
<head><title>使用者登入</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">



<script language="JavaScript">
<!-- Hide

function setfocus() {
        document.first.usr_t.focus();
        return;
}

// -->
</script>

</head>
<body  link="#0000FF" vlink="#0000FF" text="#CCFFFF" onLoad="setfocus()"  bgcolor="<?echo $bgcolor_main?>">

<table border="0">
<tr>
<td height="25">
</td>
</tr>
</table>



<div align="center">
<form action="<?echo $PHP_SELF?>" method="post" name="first">


<table width="220" cellspacing="2" cellpadding="5" align="center" border="2">
<tr>
<td class="bg2" height="23" align="left" colspan="2">
請輸入帳號及密碼
</td>
</tr>

<tr>
<td class="block1" valign="top" align="center">

帳 號: <input type="text" autocomplete=off size="20" name="usr_t" class="block5" value="<?echo $usr_t?>"><br><br>
密 碼: <input type="password" autocomplete=off size="20" name="pas_t" class="block5"><br><br>
<div align="center"><input type="submit" value="登入" class="Fontsize"></div>

</td>
</tr>

</table>
<br>
</form>
</div>
</body>
</html>

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #12 於: 2004-07-13 15:01 »
這個時候找起來就有點麻煩了
尤其是php程式碼跟html混用的時候就常常會發生這種討人厭的情況
可以先試著找看看
事不是在程式最開頭的地方留下了空白或是斷行
在程式開頭到第一個<?php出現的這一段中間的字元php會視為html
會導致在header送出前就先送出html了
照理來說既然是header就表示他得在第一行輸出
在他輸出之前不能有任何html存在或是送出任何echo
哈哈找到了
代碼: [選擇]

    for ($i=0;$i<$pas_index;$i++)
   {
      $passck[$i]=mysql_fetch_array($result_pas);

      if ($passck[$i][mem_id]==$usr_t and $passck[$i][mem_pas]==$pas_t)
        {
         $keyid=$passck[$i][mem_key];
         $memid=$passck[$i][mem_id];
         $nameid=$passck[$i][mem_name];
   }
}
?>

<? //看到沒上面一行的地方上面是不是留空白啦那行是html
if ($usr_t && $pas_t)
{

   if ($keyid && $memid && $nameid)
     {
                    header("Location:index.html"); //<---header是在這邊送出的
                    die;    
      //echo "<font color='yellow' class='FontSize18'>請稍後, 登入中...</font><br><br>";
      //echo "<meta http-equiv='refresh' content='1;URL=index.html'>";
     }

}
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #13 於: 2004-07-13 15:04 »
還有忘了提一點
程式結尾的地方那堆html
雖然程式在header送出後就結束了
可是結尾的html並不受程式結束的影響喔
他還是會乖乖送出的
只是我沒試過這樣會導致什麼後果
try看看吧應該行的通吧
如果行不通的話再想辦法把他用if框起來吧
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於上一頁網頁過期的問題??
« 回覆 #14 於: 2004-07-13 21:46 »
哈哈 !! ricky兄太厲害了,那一行空白果然是兇手,我終於成功了,萬分感激...今天真是上了重要的一堂課 :D

另外,我這樣試了一下....
如果不用header(Location...),改用<meta refresh....)
只要在<input>有輸入欄位的地方之前,使用die,雖然有送出部份html,一樣也可以達到這種作用,而也都沒有網頁過期和重新登入的問題,只是目前還不知道會不會因此產生其他的問題,謝謝您的幫忙喔 !!

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於上一頁網頁過期的問題??
« 回覆 #15 於: 2004-07-14 16:44 »
不客氣...
經驗就是這樣慢慢累積起來的
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/