2012-08-12 180 views
2

我爲我正在開發的一個小型項目創建了一個剝離框架,除了一個小問題外,一切都很順利。.htaccess - 尾部斜槓中斷重定向

我的文件夾結構,如下所示:

root 
    - app 
    - controller 
    - views 
    - webroot 
     - css 
     - js 
     - img 
     - misc 
    - config 
    - data 
    - lib 

在根目錄我有一個.htaccess文件,該文件的請求發送到webroot夾重定向:

RewriteEngine on 
RewriteRule  ^$  app/webroot/ [L] 
RewriteRule  (.*) app/webroot/$1 [L] 

一次,我有另一.htaccess文件檢查該請求是否是文件或文件夾的直接請求,如果不是,則傳遞到webroot中的index.php文件:

RewriteEngine On 
RewriteCond  %{REQUEST_FILENAME} !-d 
RewriteCond  %{REQUEST_FILENAME} !-f 
RewriteCond  %{REQUEST_FILENAME} !favicon.ico$ 
RewriteRule  ^(.*)$    index.php?uri=$1  [QSA,L] 

正如我所說的,這是所有工作正常,但有一個小問題:

當你請求http://example.com/misc,它在地址欄中的地址更改爲http://example.com/app/webroot/misc/

當您要求http://example.com/misc/,這不會發生!

主要的一點是,該項目的目的,人們會需要直接訪問在「雜項」文件夾中的文件,在那裏有一個index.html文件,這意味着人們去http://example.com/misc理想就沒有重寫URL,它只會去該文件。我有這樣做的原因,這對於這個問題並不重要,所以在任何人走之前「你不應該讓你的文件夾設置成這樣」我已經嘗試了很多不同的方式來做這件事,爲了項目的目的,這是最好的方式來做到這一點。

回答

1

這是mod_dir正在做的事情,所以如果它認爲請求是針對一個目錄但缺少一個結尾的斜槓,它將301重定向瀏覽器的尾部斜線。不幸的是,當這種情況與內部URI重寫一起發生時,重寫的URI會在301重定向中混淆,因此它會被暴露。你必須做一個先發制人的重定向,以便mod_dir不會做它的事情。

嘗試app/webroot/規則

RewriteCond %{DOCUMENT_ROOT}/app/webroot%{REQUEST_URI} -d 
RewriteRule ^(.*[^/])$ /$1/ [R=301,L] 
+0

奇之前添加此,我想這樣做它的其他方式,加上斜槓的URL,但我從來沒有想過的簡單剝離/應用程序/ webroot的部分出! – 2012-08-12 19:50:02