2016-08-22 29 views
2

我讀過無處不在Apache的重寫引擎,模式替換按預期工作的正則表達式,所以我嘗試:

的.htaccess
RewriteRule (.*) index.php?route=$1

但在get VAR到domain.com/some/url請求路線我得到的index.php代替some/url

在HTTP VAR REDIRECT_QUERY_STRING我得到route=some/url
QUERY_STRING我得到route=index.php

出了什麼問題嗎?

PS:$0也返回index.php
如果我使用RewriteRule . index.php?route=$1,我得到的路線= i,無論請求的URL。

回答

2

$1工作正常,但問題是你這個模式的使用:

(.*) 

它匹配任何東西。您的重寫規則實際上會循環並運行兩次,因爲您沒有任何RewriteCond來預先循環。

  1. 首先它運行URI = some/url和URI成爲index.php$1成爲some/url
  2. 它運行URI = index.php$1成爲index.php

您可以使用此規則來解決這個問題第二次行爲:

# If the request is not for a valid directory 
RewriteCond %{REQUEST_FILENAME} !-d 
# If the request is not for a valid file 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) index.php?route=$1 [L,QSA] 

或者,如果你想現有的文件和目錄改寫爲index.php然後使用:

RewriteRule ^((?!index\.php$).*)$ index.php?route=$1 [L,QSA,NC] 

這將改寫一切,除了index.phpindex.php

+0

謝謝! 我可以使用[L,QSA],但RewriteConds呢?他們是否有這個特定的問題?因爲我確實希望即使請求匹配現有文件或目錄名稱,它們仍然會被引導到index.php – Petruza

+0

ok我的更新答案中的檢查規則也會重寫所有文件/目錄。 – anubhava

+1

謝謝,但只是添加標誌使它工作,即使不用條件或正則表達式排除'index.php' – Petruza

相關問題