2014-01-30 101 views
1

我已經寫了下面的代碼在我的htaccess index.php文件:重定向到根

RewriteRule ^(.*)/$ $1 
RewriteCond %{REQUEST_URI} !^index.php.*$ 
RewriteRule ^(.*)$ /index.php?route=$1 [END] 

它可以完美的每一條路徑,除了存在目錄。例如,如果我輸入http://localhost/profilepic並且這樣的目錄實際存在,它將重定向到http://localhost/profilepic/?route=profilepic,但我希望它是隱含轉換爲http://localhost/index.php?route=profilepic

在此先感謝。

回答

1

這是因爲mod_dir and the DirectorySlash directive。從本質上講,如果它看到一個沒有結尾斜線的URI,並且它映射到一個現有的目錄,那麼它將重定向請求,使其具有尾部斜線。由於mod_dir和mod_rewrite都位於URL文件處理管道的不同位置,因此mod_dir和mod_rewrite都會應用到同一個URL。這就是爲什麼你最終得到一個重定向和一個奇怪的URL與查詢字符串。

如果你絕對必須有沒有尾部斜線的目錄,那麼你需要打開DirectorySlash。關閉它的問題是存在信息泄露安全問題,即使您有索引文件,人們也可以查看目錄的內容。這意味着你必須使用mod_rewrite來彌補mod_dir。

因此擺脫了規則:

RewriteRule ^(.*)/$ $1 

並更換這些規則:

DirectorySlash Off 

# redirect direct requests that end with a slash to remove the slash. 
RewriteCond %{THE_REQUEST} \ /+[^\?\ ]+/($|\ |\?) 
RewriteRule ^(.*)/$ /$1 [L,R] 

# internally add the trailing slash for directories 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ /$1/ [L] 
+0

謝謝Jon!這解決了這個問題;) – Javid

1

這裏是另一種方式,你可以有不關閉DirectorySlash您的規則(考慮一個安全漏洞):

RewriteEngine On 

# remove trailing slash for non-directories 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s] 
RewriteRule ^(.+?)/$ /$1 [R=301,L] 

# routing for directories 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+?)/$ /index.php?route=$1 [L] 

# routing for non directories 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+?)/?$ /index.php?route=$1 [L] 
+0

+1這個很好的解決方案。 TNX。 L:什麼意思? – Javid

+1

L是將一條規則標記爲'Last',它將重寫的URL重新注入mod_rewrite引擎。 – anubhava