2012-05-10 130 views
0

中從Codeigniter中刪除index.php Codeigniter應用程序通常使用mod_rewrite從url中排除字符串index.php。我在同一個域中有兩個Codeigniter應用程序。一個Codigniter應用程序位於Web根文件夾中,另一個Codigniter應用程序位於Web根文件夾的子文件夾中。mod_rewrite在子目錄

笨應用1:

http://domain.com/index.php 

笨應用2(着陸頁的應用程序):

http://domain.com/land/index.php 

兩個笨的應用是每個原子,不把它們之間共享任何文件。 Codeigniter框架中的每個文件都在public_html/中,並且再次在public_html/land/中。所以我需要在網址/的文件夾中排除字符串index.php,並排除/land/子文件夾中的字符串index.php

根文件夾中的.htaccess文件使用Codeigniter wiki中廣泛推薦的mod_rewrite規則(代碼如下),這組規則適用於根Codeigniter應用程序(應用程序1)。這些規則駐留在Web根文件夾中。

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    #Removes access to the system folder by users. 
    #Additionally this will allow you to create a System.php controller, 
    #previously this would not have been possible. 
    #'system' can be replaced if you have renamed your system folder. 
    RewriteCond %{REQUEST_URI} ^system.* 
    RewriteRule ^(.*)$ /index.php?/$1 [L] 

    #When your application folder isn't in the system folder 
    #This snippet prevents user access to the application folder 
    #Rename 'application' to your applications folder name. 
    RewriteCond %{REQUEST_URI} ^application.* 
    RewriteRule ^(.*)$ /index.php?/$1 [L] 

    #Checks to see if the user is attempting to access a valid file, 
    #such as an image or css document, if this isn't true it sends the 
    #request to index.php 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    # If we don't have mod_rewrite installed, all 404's 
    # can be sent to index.php, and everything works as normal. 

    ErrorDocument 404 /index.php 
</IfModule> 

上述一套規則在根Codeigniter應用程序中從urls中刪除index.php沒有問題。但是這組規則似乎不允許執行public_html/land/.htaccess中的mod_rewrite規則。

當我刪除public_html/.htaccess中的mod_rewrite規則時,開始評估public_html/land/.htaccess中的mod_rewrite規則。

有沒有辦法改變public_html/.htaccess中的mod_rewrite規則來處理打算訪問/land/子文件夾的URL的特殊情況?

我認爲最好的解決方案可能是更改public_html/.htaccess中的mod_rewrite規則,以允許在url中尋址子文件夾時執行public_html/land/.htaccess中的mod_rewrite規則。我願意接受任何建議。

對「爲什麼不只是使用子域?」這個問題的先發制人的答案。 1.節省SSL證書的費用。 2)非技術用戶有時會被子域名混淆用於營銷基本域名。

對「爲什麼不將Codeigniter應用程序結合使用以在框架中使用相同的文件?」的先發性回答?複製框架文件是保持版本存儲庫分離的簡單方法。

+0

將該文件夾添加到RewriteBase中,如下所示:RewriteBase/land/ – Drewdin

回答

1

在頂部添加一條規則,如果它是請求字符串的一部分,則轉到land子文件夾。這樣,/land/.htaccess中的規則將被執行,而不是/.htaccess中的後續規則。所以把這個頂部:

RewriteRule ^land.*$ - [NC,L] 

這將檢查該請求是否與「土地」開始,它重定向到子目錄,其中對應於該子目錄的.htaccess規則將被代替使用。

現有的規則檢查文件和文件夾,而不是在請求對應其中一個時進行重寫的原因是因爲請求中的任何後續「land」可能都不是真實文件,因此重寫規則會觸發。

+0

這不適用於我。我在'public_html/.htaccess'的規則頂部添加了該行,但是'public_html/land/.htaccess'不會執行。我通過故意在'public_html/land/.htaccess'中導致服務器錯誤進行了測試,但.htaccess文件從未運行,並且沒有服務器錯誤。只是一個404錯誤。 – steampowered

+0

404錯誤很奇怪 - 它應該至少找到一些東西加載在土地subdir的權利?你可以添加一個規則來記錄重寫並檢查日誌嗎? RewriteLog「/usr/local/apache/logs/rewrite.log」 RewriteLogLevel 4 並確保日誌文件夾和文件存在並可由Web服務器寫入。 – Ansari

+0

這是一個很好的建議來記錄重寫。謝謝! – steampowered

1

的問題是在public_html/.htaccess的規則重寫URL的要/land/,你需要一個直通這使得它使沒有任何反應時/land/是requested.Add:

RewriteRule ^land/ - [L] 

你的規則其餘部分之前。

+0

這對我不起作用。我在'public_html/.htaccess'的規則頂部添加了行,但'public_html/land/.htaccess'不會執行。我通過故意在'public_html/land/.htaccess'中導致服務器錯誤進行了測試,但.htaccess文件從未運行,並且沒有服務器錯誤。只是一個404錯誤。 – steampowered