2014-06-19 31 views
0

我的目標是:首先重定向,則替換使用的.htaccess

  1. 用戶訪問的URL - http://example.com/index.php?order_result=1&orderID=1500638
  2. 地址被轉換成 - http://example.com/order/success.php?id=1500638 沒有實際的重定向,「原因有沒有‘http://example.com/order/success.php’腳本在服務器上。
  3. 通過訪問URL「http://example.com/order/success.php?id=1500638」用戶從第一個腳本中獲取數據 - http://example.com/index.php?order_result=1&orderID=1500638。 所以沒有實際的重定向,URL地址被替換(瀏覽器窗口中的url地址被更改)以及從請求的url中檢索到的結果數據。

這就是我成功地實現:

Options +FollowSymlinks 
RewriteBase/
RewriteCond %{QUERY_STRING} ^order_placement_result=([0-9]+)&orderID=(.*)$ 
RewriteRule index\.php /order/success.php?id=%2 [C,N] 
RewriteCond %{REQUEST_URI} ^/order/success.php$ 
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ 
RewriteRule ^/order/success.php?id=([0-9]+)$ /index.php?order_placement_result=1&orderID=$1 [L] 

/更新:忘了告訴大家,在我的腳本的問題是在最後一行。我測試了它使用http://htaccess.madewithlove.be/ 不明白是什麼問題!

它讓我大跌眼鏡!請幫助

回答

2

你正面臨着一個經典的無限循環問題。除此之外,我還想清除幾件事:

  • 您只能通過重定向用戶來更改瀏覽器地址欄中顯示的網址。您需要使用R標誌要做的就是執行任何腳本之前該
  • .htaccess是跑了。如果你在你的.htaccess有你的服務器上的文件test.php,規則RewriteRule ^test\.php$ /foo [R],去http://example.com/test.php,test.php的將永遠不會被運行的腳本,因爲Apache將用戶重定向到/foo它得到一個點之前,它會運行劇本。
  • 在mod_rewrite的無限循環問題是,當一個規則的結果可通過其他規則相匹配,並且該規則的結果可以通過所述第一規則進行匹配。儘管你想完成的是可能的;你只需要以不同的方式處理它。
  • N標誌不會解決你的.htaccess邏輯問題。它會繞過內部遞歸的自動限制,可能會導致Apache崩潰並創建一個巨大的錯誤日誌。這隻在極少數情況下才有用。如果您真的需要,可以考慮使用[L],並且LimitInternalRecursion的限制較大。當你忽略了某些東西,並且由於一些意外的URL導致Apache不斷崩潰時,它將爲你節省噩夢。
  • RewriteRule.htaccess中的第一個參數將只匹配路徑名/之後和查詢字符串之前的所有內容。如果您的.htaccess位於您的文檔根目錄中,則它將在url http://example.com/test.php?id=3中匹配test.php。如果您嘗試匹配^/,它永遠不會匹配任何內容,因爲前導斜槓始終包含在路徑名稱中。

你需要有2條規則。其中一個規則是改變瀏覽器網址的外部重定向。另一個規則是內部重寫,將漂亮的url更改爲「醜陋」url。爲防止重定向循環,您需要匹配外部請求(%{THE_REQUEST}),因爲即使您重寫了內部表示形式,它也不會更改。

Options +FollowSymlinks 
RewriteBase/

#External redirect 
RewriteCond %{THE_REQUEST} ^(GET|POST)\ /index\.php\?order_placement_result=([0-9]+)&orderID=(.*)\ HTTP 
RewriteRule^/order/success.php?id=%3 [R,L] 

#Internal rewrite 
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ 
RewriteRule ^order/success\.php$ /index.php?order_placement_result=1&orderID=$1 [L] 

請注意,這是未經測試的,但如果我沒有搞糟,它應該工作。

+0

謝謝你的幫助!你的解決方案就像一個魅力!另外,感謝編輯我的文章(英文不是我的母語,我缺乏實踐) – netgoblin