2012-04-19 214 views
0

這個問題已經被編輯過澄清:如何避免在mod_rewrite中循環?

我想如下打造「漂亮網址」應該把自己僞裝:

mysite.com/index.php?p=1 = => mysite.com/site_one/index.php

mysite.com/aboutus.php?p=2 ==> mysite.com/site_two/aboutus.php

mysite.com/anypage.php? p = 3 ==> mysite.com/site_three/anypage.php

正如你所看到的,mod_rewrite的應該簡單地轉換爲「P」變到預定的僞目錄(該目錄不存在......這只是一個審美重寫)。

很明顯,這會造成一種複雜化。當用戶訪問mysite.com/site_one/index.php時,應該有一個背景轉移到mysite.com/index.php?p=1。此背景傳輸會導致導致服務器錯誤的循環。

我試圖通過使用下面的代碼,以防止這種循環:

RewriteCond %{QUERY_STRING} !NON= 
RewriteCond %{QUERY_STRING} ^(.*[&?])?p=1([&].*)?$ 
RewriteRule ^/?(.*) /site_one/$1 [PT,L] 


RewriteCond %{QUERY_STRING} !NON= 
RewriteRule ^/?site_one/?(.*) /$1?NON=1&p=1 [PT,L] 

不幸的是,這還是引起了服務器錯誤。任何人都可以看到代碼出錯的地方嗎?

+0

雖然我非常有信心可以將一些基於RewriteCond的規則集中在一起來幫助您解決這個特定情況,但這可能無濟於事。有關您需要處理的頁數的更多信息,以及如何維護「p」值與友好URL之間的映射關係,這對您的問題會有幫助。 – timdev 2012-04-19 20:45:21

+0

當然,讓我更詳細地解釋一下: 「p」的值可能會改變,所以我會爲每個「p」值添加規則。例如,如果「p = 1」,該網站將顯示「mysite.com/site_one」。如果「p = 2」,該網站將顯示「mysite.com/site_two」。如果「p = 3」並且用戶正在呼叫名爲「about.php」的頁面,則站點應該顯示「mysite.com/site_three/about.php。 基本上,」p「變量只是僞裝成目錄 我希望這是有道理的。 – inveni0 2012-04-19 20:58:45

+1

爲什麼不直接在$ p變量中命名頁面,以便您可以執行諸如www.mysite.com/about/ - > www.mysite.com/page .php?p =大約。這隻需要1條規則,而不必爲每個頁面設置規則 – Tom 2012-04-19 21:00:39

回答

0

由於沒有htaccess方法幫助我,我不得不解決這個問題。我基本上將所有「p」值轉發到適當的頁面,並將變量「p」更改爲變量「s」。然後我告訴我的網絡應用程序,「p」的值等於「s」存在的「s」的值。我把這段代碼放在一個與服務器通信的文件中,所以它出現在我所有站點的頁面上。

這是醜陋的,馬虎,但我也必須這樣做的原因是這樣。

0

如果你願意,你可以在後臺設置一個虛擬查詢變量var。嘗試這樣的:

RewriteEngine On 

RewriteCond %{QUERY_STRING} !NON= 
RewriteCond %{QUERY_STRING} ^(.*[&?])?p=1([&].*)?$ 
RewriteRule ^/?page.php /main_site/ [R,QSA] 

RewriteCond %{QUERY_STRING} !NON= 
RewriteRule ^/?main_site/?(.*) /page.php?NON=1&p=1&extra=$1 [QSA,L] 

而只是忽略NON從get/request在PHP中。

+0

我在這裏測試過了,它失敗了。我不太熟悉,不知道它是語法錯誤還是工具錯誤。 http://martinmelin.se/rewrite-rule-tester/ – inveni0 2012-04-19 22:11:56

+0

@ inveni0然後嘗試http://htaccess.madewithlove.be/(或先在本地機器上測試xampp),因爲NOT('!')doesn似乎沒有編入你給的網站 – craniumonempty 2012-04-19 23:00:36

+0

好得多。我修改了您的答案: 'RewriteCond%{QUERY_STRING}!NON = RewriteCond%{QUERY_STRING} ^(。* [&?])?p = 1([&]。*)?$ RewriteRule ^/?(。*)/ main_site/$ 1 [PT,L] RewriteCond%{QUERY_STRING}!NON = RewriteRule^/?main_site/?(.*)/ $ 1?NON = 1&p = 1 [PT,L] ' 它在測試網站上顯示爲正常,但在我的服務器上無效(內部服務器錯誤)。任何想法可能會導致什麼? – inveni0 2012-04-19 23:39:25