2012-05-06 68 views
0

我有一個前端控制器執行以下操作:一些重寫規則,導致404無法正常使用

$pages = array('home', 'login', 'create-account', 'activate'); 
$page = ((empty($_GET['p'])) ? 'home' : $_GET['p']); 

if (in_array($page, $pages) && file_exists($page . '.php')) 
    include $page . '.php'; 
else 
    include '404.php'; 

然後,我有這個mod_rewrite

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([a-z-]+)$ index.php?p=$1 [L] 
RewriteRule ^(activate)/([\w-]+)$ index.php?p=$1&f=$2 

如果我訪問

http://localhost/folder/login

它的工作原理:

如果我訪問:

http://localhost/folder/ $$$$

它將給我一個真正的404(我的自定義:P),而不是把我送到404頁。這是因爲,重寫規則的:

重寫規則^([AZ - ] +)$的index.php P = $ 1 [L],因爲它僅接受AZ和 -

如果我將其重寫到:

RewriteRule ^(.*)$ index.php?p=$1 [L] 

它的工作,併發送至404,但隨後這個重寫是行不通的:

RewriteRule ^(activate)/([\w-]+)$ index.php?p=$1&f=$2 

因爲第一匹配。

如果我試圖改變的地方:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(activate)/([\w-]+)$ index.php?p=$1&f=$2 [L] 
RewriteRule ^(.*)$ index.php?p=$1 [L] 

我得到的所有網頁上的404。

我該如何解決這個問題?

+0

你的重寫規則似乎只是尋找小寫字母和破折號? – OmnipotentEntity

+0

請閱讀整個問題。 – John

+0

你可能想嘗試使用'RewriteRule ^([^ /] *)$ index.php?p = $ 1',這會排除任何帶有/的字符串(因此你的第一個字符串會再次工作)。但是這會導致垃圾與/ s在裏面,不會sl in。 – OmnipotentEntity

回答

-2

問題已解決。用不同的方法,我用PHP解析了url。

+0

您的重寫規則是純粹的和簡單的錯誤。您現在可能已經能夠通過一些PHP代碼掩蓋實際問題,但最終它會在最後回來捏你。 – anubhava

+0

.htaccess也被重寫... – John

+1

在這種情況下,在您的答案中提供完整的解決方案。否則,您可以選擇完全刪除您的問題。 – anubhava