[英]Help With Infinite Redirect From .htaccess using MVC with PHP
讓我先說一下我對.htaccess創作相當新,並且通常會將我的細節留給我的托管服務提供商。 我最近決定在php中實現一個手動MVC框架,並使用.htaccess文件重定向使用“seo”友好網址。 我的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¶meter=$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路由器解決方案是最好的。 感謝@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文件添加規則。 現在我可以提供任意數量的參數並在代碼中處理路由邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.