2011-03-04 114 views
1

我正在嘗試編寫一個檢查程序,以便根據用戶通過網站註冊過程的進度來重定向用戶。我有這樣的:

來自PHP頭的奇怪行爲()

if($user = VRComponent::getLogin()) { 
    if(VR::exists('vr_user','Signup',"userID={$user->ID}")) { 
     $step = VR::select('vr_user','Signup',"userID={$user->ID}"); 
     $step = intval($step[0]['step']); 
     if(!isset($_GET['step']) || $step != intval($_GET['step'])) { 
      switch($step) { 
       case 1: header("Location: /signup/one"); exit; break; 
       case 2: header("Location: /signup/two"); exit; break; 
       case 3: header("Location: /signup/three"); exit; break; 
       case 4: header("Location: /signup/four"); exit; break; 
      } 
     } 
    } else { 
     header("Location: /account"); 
     exit; 
    } 
} else { 
    header("Location: /"); 
    exit; 
}



的存在和選擇功能基本上只是別名MySQL的功能。

基本上這會檢查用戶是否已登錄。如果是,它將檢查他們是否已完成註冊過程。如果不是,它會檢查是否傳遞的「頁面」實際上是它們所在的最後一頁。如果沒有,它會將它們重定向到正確的頁面。

邏輯工作,但是頁面引用的所有外部js和css文件不加載。奇怪的是,他們不扔了404,而不是文件的唯一內容是:

Failed to load source for: https://domain.com/path/to/file/style.css

另一個奇怪的是,即使在if語句的條件是虛假的文件不加載。註釋掉switch語句(即使if條件爲false)允許加載文件,但當然邏輯將不正確。

我覺得它非常簡單,但我只是沒有看到它。我即將把我的拳頭放在監視器上,因爲這種行爲對我來說毫無意義。

在此先感謝
-D

+0

你可以休息;退出後; – dynamic 2011-03-04 21:14:19

回答

0

更新:我睡在上面,當我醒來後,我想出了實際的問題(這是一個清醒的頭腦可以做的驚人的)。事實證明,PHP正在做我正在告訴它做的事情。因爲我從來沒有對任何第三方PHP框架感到滿意,所以我決定在一段時間後創建自己的。它所做的一件事是將所有給定頁面中使用的所有css和js文件自動剔除到單個文件中,以減少http請求的數量。它也反映了主要頁面在這些css/js文件中的要求,並且我設置了apache,因此它將執行內聯PHP。因此,問題代碼被js/css文件需要,然後重定向到一個註冊頁面,因爲$ _get ['step']未定義。不過,這種東西真的讓我很高興我使用自己的框架。當然,有時它會讓我想像中世紀的人類那樣,在一些殭屍身上斧頭,但是它提供的自由和進化的能力遠遠超過了憤怒。不僅如此,它使得一切都變得如此簡單(當我實際編寫代碼時)比我使用的任何其他框架都更容易。也許有一天當我覺得它已經準備好黃金時段時,我會將它發佈給公衆。

Old ------------------------------------
經過幾個小時研究我修好了!

問題是一個重定向循環的種類。由於我未知的原因,外部文件正在我的OP中從php文件中運行,然後將位置更改爲其中一個重定向。

爲了解決這個問題,我檢查了php_self中的'.css'和'.js',如果找到了,則不允許重定向。這裏是修改後的代碼:

if($user = VRComponent::getLogin()) { 
    if(VR::exists('vr_user','Signup',"userID={$user->ID}")) { 
     $step = VR::select('vr_user','Signup',"userID={$user->ID}"); 
     $step = intval($step[0]['step']); 
     $css = stripos($_SERVER['PHP_SELF'],'.css'); 
     $js = stripos($_SERVER['PHP_SELF'],'.js'); 
     if(!$css && !$js && (!isset($_GET['step']) || $step != intval($_GET['step']))) { 
      switch($step) { 
       case 1: header('Location: /signup/one'); 
        break; 
       case 2: header('Location: /signup/two'); 
        break; 
       case 3: header('Location: /signup/three'); 
        break; 
       case 4: header('Location: /signup/four'); 
        break; 
      } 
     } 
    } else 
     header("Location: /account"); 
} else 
    header("Location: /");

是的,它很粗糙,我會遲早設計一個更優雅的解決方案,但現在必須這樣做。

謝謝大家的幫助。

3

我想象你正在使用mod重寫來處理signup/*?如果是這樣,你可能需要在你的HTML的<head>申報<base href="APPROPRIATE BASE" />使瀏覽器不會對CSS/JS假定註冊文件夾LOOK =)

+0

沙德是對的。瀏覽器可能會要求/signup/cssfile.css而不是/cssfile.css。 可能mod_rewrite將每404轉發到前端腳本,所以你也看不到錯誤。 – 2011-03-04 06:12:27

+0

一直在思考這個問題,並沒有明確的答案,我不得不說Shad的答案在我看來目前是最合適的。什麼說你德里克,在測試這個理論時有什麼好運? – 2011-03-04 06:15:15

+0

我以爲這可能是這樣的,但我使用的是外部文件的所有絕對路徑。此外,「未能加載源」錯誤正確地聲明瞭文件的完全限定路徑,它們只是不加載。 – 2011-03-04 06:25:17