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

使用MVC和PHP从.htaccess无限重定向的帮助,php,.htaccess,mod-rewrite,redirect,Php,.htaccess,Mod Rewrite,Redirect,让我先说一句,我对.htaccess创作是相当陌生的,通常把细节留给我的主机提供商。我最近决定在php中实现一个手动的MVC框架,并使用.htaccess文件使用“seo”友好的URL重定向。我的MVC实现使用变量模块、类、事件和参数。它们在url中按该顺序指定,例如。我希望它的工作,如果你砍掉任何部分的网址。这一切都很正常,直到我将我的站点提升了一个级别,然后复制了我的.htaccess文件。现在我得到了一个无限重定向循环,其中一条规则在我移动它之前运行得很好 这是我的.htaccess文件:

让我先说一句,我对.htaccess创作是相当陌生的,通常把细节留给我的主机提供商。我最近决定在php中实现一个手动的MVC框架,并使用.htaccess文件使用“seo”友好的URL重定向。我的MVC实现使用变量模块、类、事件和参数。它们在url中按该顺序指定,例如。我希望它的工作,如果你砍掉任何部分的网址。这一切都很正常,直到我将我的站点提升了一个级别,然后复制了我的.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]

它工作得很好。问题是,如果我忽略了这一点,而有人键入了404,我会得到一个404(因为该目录不存在,并且没有匹配的规则)。那么,为什么这个规则现在不起作用,为什么index.php(和这个.htaccess文件)在子目录中时它起作用呢

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

这是我现在使用的简化的.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文件添加规则。现在,我可以提供任意数量的参数,并在代码中处理路由逻辑。

这些规则是否在下面的子目录中重复?另外,您可能只想使用基于php的路由器。这样,您就有了一组更简单的规则jsut转到index.php,然后让php根据您提供的规范来排序变量的位置。您可以自己修改,也可以使用Zend Framework组件(尽管您可能需要切换到它们的前端控制器或至少调整您的控制器以适应它们的界面)。您好,您是否考虑过询问?@prodigitalson否规则不会在子目录中重复。我有一个名为public的子目录,我的框架以前就放在这个目录中。我的顶级目录有一条规则,如果url上没有指定目录,它会重定向到公共目录。正如我所说的,在我将网站升级之前,所有这些工作都很顺利。我要看看php路由器解决方案。@Herr Kaleun好主意,我也会在那里发布。谢谢不客气;)他们会解决你的问题。