2012-03-09 66 views
0

我在我的.htaccess下面的代碼:的.htaccess mod_rewrite的鏈接到錯誤的頁面

RewriteEngine On 
RewriteRule ^/?([^/\.]+)/?$ $1.php [L] 
RewriteRule ^/?([^/\.]+).php$ $1/ [R,L] 

RewriteRule ^/?([^/\.]+)/?$ $1.php [L]工作正常。這是做什麼是採取像http://www.example.com/whatever的網址,並使其閱讀http://www.example.com/whatever.php頁面。

但是,我希望能夠做的是帶上像http://www.example.com/whatever.php這樣的網址並自動發送到http://www.example.com/whatever,因此是代碼的第二行。但是,這不起作用。現在做什麼,只要遇到以.php結尾的鏈接,網址就會變成http://localhost/C:/Sites/page/whatever/,並拉動403: Forbidden頁面。

所有我想知道什麼是我可以讓http://www.example.com/whatever.php將被解讀爲http://www.example.com/whatever,而且如果http://www.example.com/whatever.php輸入到地址欄,它會自動重定向到http://www.example.com/whatever

這是否有意義?

編輯

好了,看來我是不是太清楚..基本上,我想/whatever/改爲whatever.php而網址仍然停留作爲/whatever/,對不對?但是,如果URL爲/whatever.php,我希望它實際上用戶的URL重定向到/whatever/,然後再次將其讀取爲whatever.php。這可能嗎?

回答

1

如果你是規則的.htaccess文件裏面,你可以當你對陣一個URI省略斜線:

RewriteRule ^([^/\.]+)/?$ /$1.php [L] 

還要注意的是一家領先的斜線被包含在目標(/$1.php) ,這確保/whatever/被重寫爲/whatever.php。當你重定向的時候,如果你缺少這個主要的斜線,apache會在它前面加上文檔根目錄。因此/whatever.php被重定向到文檔根目錄C:/ Sites/page/whatever/。即使你包括領先的斜線,這永遠不會工作,因爲你要引起重定向循環:在地址欄中

  1. 輸入「http://www.example.com/whatever.php」
  2. 阿帕奇將您重定向到「http://www.example.com/whatever/」
  3. 阿帕奇得到URI 無論/和應用的第一個規則和URI被改寫爲/whatever.php
  4. 的URI獲得通過重寫引擎再次放
  5. URI /whatever.php與第二條規則匹配,並將瀏覽器重定向到「http://www.example」。COM /不管/」
  6. 重複步驟3-5

您需要添加一個條件是實際要求/whatever.php

RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php 
RewriteRule^/%2/ [R,L] 

這麼幹脆,你必須:

RewriteEngine On 
RewriteRule ^([^/\.]+)/?$ /$1.php [L] 
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php 
RewriteRule^/%2/ [R,L] 
+0

喬恩謝謝!我早些時候嘗試了這個代碼,但它似乎沒有工作,但今天早上我又試了一次,你知道什麼,它的工作原理!看起來我的'.htaccess'只是有一瞬間..仍然,非常感謝你! – 2012-03-11 22:10:32

0

你正在做的相對路徑替換在每個導演y上下文(.htaccess是按目錄的上下文)。這需要RewriteBase。每個目錄的重寫都是在處理的後期階段完成的,當時URL已經映射到路徑。但重寫必須產生一個URL,再次處理。我認爲如果沒有RewriteBase提供URL前綴,最終會得到一個文件系統前綴而不是URL。這可能是你得到C:/Sites的原因。嘗試RewriteBase。但是,在正確的RewriteBase指定正確的URL前綴到相對重寫的部分前面後,恐怕你會有重寫循環,因爲你正在將whatever.php重寫爲whatever;和whateverwhatever.php

參考:http://httpd.apache.org/docs/current/rewrite/tech.html

+0

乾杯卡茲,我認爲這可能會有很大的不同。然而,我並沒有像'whatever.php'那樣''whatever''把''whatever''重新指定爲'whatever.php',我想,只是在它看到'whatever'時告訴它,從'whatever.php'中繪製信息。有沒有什麼辦法可以做到這一點,如果它看到'whatever'將從'whatever.php'中繪製,但url仍然會顯示'whatever',但是如果url是'whatever.php',它將會重定向到「什麼」? – 2012-03-10 06:32:05