這些規則:
RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
導致內部重寫循環。重寫引擎遍歷所有的規則,直到內部重定向已達到極限(從而導致500服務器錯誤)或導致URI出來的發動機的是,走進它的人一樣。此外(這是一個非常重要的概念),之前是在htaccess文件發送到重寫引擎規則的URI的前導斜槓被刪除。所以在這裏,我們有:
- 提出要求:http://domain.com/blah
- URI = /等等
- 條斜線,URI = 等等
- 等等匹配
^([^/]*)$
,規則被應用, URI = /index.php?page=blah
- 嗒嗒不等於的index.php
- 規則循環,URI = 的index.php
- 條斜線,URI = 的index.php
- 的index.php比賽
^([^/]*)$
,規則是施加的,URI = /index.php?page=index.php
- 索引不等於的index.php
- 規則循環,URI = 的index.php
- 條斜線,URI = 的index.php
- 的index.php匹配
^([^/]*)$
,施加規則,URI = 的index.php ?頁=的index.php
- 指數不等於的index.php
等
對於如何處理這個問題你有幾個選擇。所述simples是簡單地從目標移除/
:
RewriteRule ^([^/]*)$ index.php?page=$1 [L]
這將使所以在上述步驟9中,索引將等於的index.php,從而停止重寫處理(前第二次得到應用)。唯一的缺點是如果你需要重定向,或者如果htaccess文件被移動,目標中的相對URI有時會被誤認爲文件路徑而不是URL路徑(apache猜測這個,有時候apache會猜測錯誤)。
RewriteBase/
RewriteRule ^([^/]*)$ index.php?page=$1 [L]
您還可以添加條件,使它這樣的URL點到現有資源將排除得到應用這個規則:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
因此,如果這可以通過包括底座固定URI指向一個現有的文件或目錄,該規則被跳過。因此,在第一次重寫之後,當URI變爲/index.php時,由於該文件存在,規則將第二次跳過。這也使得它在文檔根目錄中的圖像,CSS,腳本或靜態頁面的請求不會通過index.php
路由。如果這不是你想要的,你也可以平出跳過如果URI已經是一個index.php文件:
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
是頁面本身的.html或php被告知顯示爲html的 – MHowey
重寫規則^ ([^ /] *)$ index.php?page = $ 1 [L]刪除index.php之前的「/」可能會解決您的問題。 – MHowey
我有一個駐留在http://sample.com/index.php的頁面。 我通過將?page = home添加到它的末尾來將變量傳遞給它。 我希望能夠使用http://sample.com/home。 –