帮助使用MVC和PHP从.htaccess进行无限重定向


Help With Infinite Redirect From .htaccess using MVC with PHP

让我在前言中说,我对.htaccess创作还很陌生,通常会把细节留给我的托管提供商。我最近决定在php中实现一个手动MVC框架,并使用.htaccess文件使用"seo"友好URL重定向。我的MVC实现使用变量模块、类、事件和参数。它们在url中按该顺序指定,例如。http://mydomain.com/module/class/event/parameter.如果你剪掉网址的任何部分,我希望它能起作用。这一切都很好,直到我把我的网站提升了一个级别,然后复制了我的.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文件)在子目录中时它起作用呢?

看起来php路由器解决方案是最好的。感谢@magnettalson的提醒。

这是简化的.htaccess,我现在正在使用

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之前所做的所有繁重工作:

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

现在,我可以从$url数组中分配模块、类、事件和参数值。它还解决了我遇到的一个问题,即我可能需要一个以上的事件参数。我不想一直为每个级别向.htaccess文件添加规则。现在我可以提供任意数量的参数,并在代码中处理路由逻辑。