2011-06-23 55 views
0

讓我先說我是相當新的.htaccess創作,並通常留給我的託管服務提供商。我最近決定在php中實現一個手動MVC框架,並使用.htaccess文件來使用「seo」友好的url進行重定向。我的MVC實現使用變量模塊,類,事件和參數。它們按照該順序在URL中指定,例如http://mydomain.com/module/class/event/parameter。如果你砍掉了url的任何部分,我希望它能夠工作。這一切都工作正常,直到我把我的網站上移一層,然後複製我的.htaccess文件。現在我得到一個無限重定向循環,其中一個規則是,在我移動它之前,它工作正常幫助無限重定向從使用MVC與PHP的.htaccess

這裏是我的.htaccess文件:

Options +FollowSymLinks 
RewriteEngine On 

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 
RewriteRule ^$ /index.php?module=default&class=home [QSA,L] 

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)$ /index.php?module=$1 [QSA,L] 

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ \ 
    /index.php?module=$1&class=$2&event=$3 [QSA,L] 

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ \ 
    /index.php?module=$1&class=$2&event=$3&parameter=$4 [QSA,L] 

現在,如果我拿出來讀取部分:

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d 
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)$ /index.php?module=$1 [QSA,L] 

它的偉大工程。問題是如果我離開這個和有人類型http://mydomain.com/module我得到一個404(因爲該目錄不存在,沒有任何規則匹配)。那麼爲什麼現在這個規則不起作用,爲什麼當index.php(和這個.htaccess文件)在一個子目錄中時它工作?

+0

這些規則在這個下面的子目錄中重複嗎?你也可能只想使用基於php的路由器。這樣你有一套更簡單的規則,然後你可以讓php根據你提供的規範來分類變異位置。你可以對你自己的,或者你可以使用Zend框架組件(儘管你可能需要切換到他們的前端控制器或至少適應你的界面)。 – prodigitalson

+0

你好,你有沒有考慮在http://serverfault.com/問? – Herr

+0

@prodigitalson不在子目錄中重複規則。我有一個名爲public的子目錄,我的框架先前已經在使用。如果沒有在url上指定目錄,我的頂級目錄有一條規則,只是重定向到公共目錄。就像我說的,在我把網站升級之前,所有這些工作都很順利。我將看看php路由器解決方案。 – SRM

回答

2

那麼它看起來像php路由器解決方案是最好的。感謝@prodigitalson的提高。

這裏是我現在用的

RewriteEngine On 

# Disable rewriting for existing files or directories 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# redirect all other requests to index.php 
RewriteRule ^.*$ index.php [PT,L] 

RewriteRule ^$ index.php [PT,L] 

簡化的.htaccess和碼本「神奇」的線路做所有繁重的的.htaccess在做之前:

$url = explode('/', trim($_SERVER['REQUEST_URI'], '/')); 

現在我可以從$ url數組中分配我的模塊,類,事件和參數值。它也解決了我可能需要一個事件的參數不止一個的問題。我不希望爲每個級別的.htaccess文件不斷添加規則。現在我可以提供任意數量的參數並處理代碼中的路由邏輯。