2012-07-19 70 views
0

好的,我在重寫.htaccess文件中的規則時感到厭煩!對靜態文件進行URL重寫檢查,然後重寫爲index.php

我期望的場景(使用URL http://doma.in/作爲例子):

  • 首先檢查以查看是否有index.html文件中的/public子目錄是否存在;如果是這樣的話,可以提供服務
    • 如果沒有,發球(重寫)index.php

要在我的例子擴大,說我們請求的URL http://doma.in/js/foobar.js

  • 首先檢查,看是否foobar.js文件中的/public/js次目錄的存在;如果是這樣的話,可以提供服務
    • 如果沒有,發球(重寫)index.php?controller=js%2Ffoobar.js

將涵蓋靜態文件,但我還需要網址,像http://doma.in/foo

  • 首先檢查,看是否foo文件中的/public次目錄的存在;如果是這樣的話,可以提供服務
    • 如果沒有,發球(重寫)index.php?controller=foo

和URL http://doma.in/foo/bar

  • 我們可以假設foo/bar不存在於/public子目錄的文件不能被命名爲喜歡該文件。
    • 所以服務(重寫)index.php?controller=foo&action=bar

我敢肯定,如果這個複雜的(對我來說)位被蓋住,那麼我可以工作的查詢串入的場合太多;所以http://doma.in/foo/bar/foo/bar將服務index.php?controller=foo&action=bar&querystring=foo%2Fbar

我也想確保一個斜線的處理一樣,如果尾隨斜線省略,例如:http://doma.in/foo/bar/foo/barhttp://doma.in/foo/bar/foo/bar/

我會從我的應用程序內處理404,就好像文件不存在,它會重定向到index.php這確實存在 - 我很高興與此,除非你有更好的解決方案:)

我真的希望這一切都有道理,因爲我一直在尋找解決方案到現在這一整天,這是我所有的:

Options +FollowSymLinks 

RewriteEngine on 

RewriteBase/

#RewriteBase /prompt-v3/ 
#RewriteCond %{REQUEST_URI} ^/prompt-v3/(.*)$ 

RewriteCond $1 !^public 
RewriteRule ^(.*)$ public/$1 [R] 

註釋掉的行在遠程主機上處理子目錄。到目前爲止,我可以重定向到/public子目錄,如果該文件存在那就是它。

謝謝大家的幫助!

回答

0
Options +FollowSymLinks 

RewriteEngine on 

RewriteBase/
#RewriteBase /sub-dir/ 
#RewriteCond %{REQUEST_URI} ^/sub-dir/(.*)$ 

RewriteRule ^index.html$ $1 [L,R=301] 

RewriteCond $1 !^public 
RewriteCond $1 !^lib 
RewriteRule ^(.*)$ public/$1 [L] 

RewriteCond $1 ^public/$ 
RewriteCond %{REQUEST_FILENAME}/index.html !-f 
RewriteRule ^(.*)$ lib/bootstrap.php [L] 

RewriteCond $1 !^public/$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond $1 ^public/(.*)$ 
RewriteRule ^(.*)$ lib/bootstrap.php?path=%1 [L] 

這將尋找在公共目錄中的index.html文件,如果它不存在重寫URL到LIB/bootstrap.php中。它實際上首先檢查作爲公共目錄中的靜態文件的任何請求並處理規範化。

0

將這個的.htaccess你的文檔根

<ifModule mod_rewrite.c> 
    RewriteEngine on 

    # For /js/foobar.js (/js/*) 
    RewriteRule ^js/(.*)$ /public/js/$1 [NC] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^public/(.*)$ index.php?controller=$1 [NC,L] 

    # For foo/bar (/*/*?*) 
    RewriteRule ^(.*)/(.*)$ /public/$1/$2 [NC] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^public/(.*)/(.*)$ index.php?controller=$1&action=$2&querystring=%{QUERY_STRING} [NC,L] 
</IfModule>