使用PHP索引页中的控制器GET变量进行Apache htaccess mod重写重定向

使用PHP索引页中的控制器GET变量进行Apache htaccess mod重写重定向,php,mod-rewrite,Php,Mod Rewrite,我正在使用一个定制的MVC PHP框架,索引页(充当路由器)接收一个GET变量“do”,其中包含它将路由到的路径。如果未设置此变量,则默认为Auth控制器、方法login require_once('config.php'); $controllerAction = isset($_GET['do'])?$_GET['do']:"auth/login"; require_once('core/main.php'); 然后索引页(上面的源代码)将这个$controllerAction传递到mai

我正在使用一个定制的MVC PHP框架,索引页(充当路由器)接收一个GET变量“do”,其中包含它将路由到的路径。如果未设置此变量,则默认为Auth控制器、方法login

require_once('config.php');
$controllerAction = isset($_GET['do'])?$_GET['do']:"auth/login";
require_once('core/main.php');
然后索引页(上面的源代码)将这个$controllerAction传递到main.php文件,该文件自动加载主控制器,然后加载请求的控制器

因此,此框架中的URI的格式为mysite.com/?do=controller/method/variable,我需要它的格式为mysite.com/controller/method/variable

下面是我尝试使用的.htaccess文件,它只是不起作用(我有其他htaccess文件在同一台服务器上工作,所以这不是Apache的问题):(

有人建议我可以用PHP来做这件事,但我不知道该怎么做

编辑: 错误是每当我尝试直接访问mysite.com/controller/method链接而不是默认的mysite.com?do=controller/method时,我都会收到“此页面无法显示”404个错误

进一步编辑

(请注意,其他虚拟主机在我的本地主机上工作正常):

(XAMPP)Apache虚拟主机信息:

<VirtualHost *:80>
    DocumentRoot "D:\sites\mysite.com\root\wwwroot"
    ServerName mysite.com
    ServerAlias mysite.com
  <Directory "D:\sites\mysite.com\root\wwwroot">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
  </Directory>
</VirtualHost>
试一试

试一试


检查您的apache日志,特别是访问日志。如果该文件夹位于web根目录中,则您应该能够直接访问它:)。您可能还想检查同一站点是否有重复的virtualhost条目。

这是我基于cake的自定义MVC框架

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?do=$1 [QSA,L]
</IfModule>

重新启动发动机
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_FILENAME}-F
重写规则^(.*)$index.php?do=$1[QSA,L]

也许这会有所帮助。此站点的典型URL模式。com/controller/method

首先,您的
.htaccess
内容存在一些问题。如果存在具有请求名称的文件,最好不要重写。这允许您为图像或任何其他静态内容(如css文件、javascript、下载等)创建一个
img/
文件夹。。第一个
RewriteCond
告诉Apache只有在不存在同名文件夹时才重写。第二种方法同样适用于文件。然后您可能需要QSA(即查询字符串追加)选项,该选项将把所有其他
GET
变量传递给脚本

在这种情况下,您可以简化正则表达式并使用:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?do=$1 [L,QSA]
你可能会感到惊讶,因为这与其他帖子或多或少是一样的。我在我的许多项目中使用了类似的东西,而且我刚刚测试过它,我可以保证它是有效的。您的apache配置一定有问题

当您在
mod_rewrite
方面遇到问题时,首先应该尝试启用模块本身。在shell中以root用户身份键入以下命令:

a2enmod rewrite
/etc/init.d/apache2 restart
第一个激活模块(如果一切正常,则抱怨模块重写已启用),第二个重新启动Apache服务器。当然,服务器上的路径可能不同

然后,您必须确保VHost配置允许您使用
.htaccess
文件并进行重写。这意味着
AllowOverride
必须至少设置为
FileInfo
(或
All
)。您还可以尝试将重写规则直接放入配置文件中。您的配置应类似于以下内容:

<VirtualHost *:*>
    ServerName test.example.com
    ServerAlias www.test.example.com
    DocumentRoot /home/sites/test/
    <Directory "/home/sites/test/">
        Allow from all
        AllowOverride All
        Options +Indexes
    </Directory>
</VirtualHost>

ServerName test.example.com
ServerAlias www.test.example.com
文档根/主/站点/测试/
通融
允许超越所有
选项+索引
请注意,如果在其中更改了任何内容,则必须重新启动Apache


如果这些都没有帮助,那么查看错误日志总是一个好主意。在我的系统上,它们位于
/var/log/apache2/error.log
(debian)。他们可能会向您提供更多关于问题所在的信息。

我不知道您的域设置是什么样的,但这里有一些建议

如果代码位于文件夹的根目录中,并且索引文件名为index.php,请尝试以下操作:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?do=$1 [L,QSA]
如果您的网站位于子文件夹(例如www.example.com/site/)中,且索引文件为index.php,请尝试以下操作(将/site/更改为您的任何文件夹)

如果仍然收到404错误消息,请执行以下操作:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?do=$1 [L,QSA]
  • 通过检查AllowOverride是否设置为all,确保您的站点允许处理.htaccess文件。如果您无法访问需要检查的配置文件,那么一个简单的测试就是设置.htaccess规则以重定向到系统上的虚拟文件。如果它工作正常,那么您的.htaccess可以正常执行
  • 查看一下您的MVC框架,看看它实际将请求发送到哪个页面。问题可能是您尚未为该特定请求定义处理程序,MVC框架的默认操作是抛出404错误
编辑:刚刚阅读了您的描述,我注意到您说过URL基本上应该类似于
mysite.com/?do=controller/method/variable
。如果对这种格式要求非常严格,那么您还需要加入删除任何前导或尾随斜杠的规则,例如,以下重写规则应该可以做到这一点:

RewriteRule ^\?(.*)\?$ /index.php?do=$1 [L,QSA]

(这使得前导斜杠和尾随斜杠是可选的,但它应该将它们从您传递的实际值中删除)。

谢谢,福里肯。我也试过了,也没用。事实上,我的主控制器在将其更改为index.php?do=cont/methodler之前,曾将链接生成为index.php?do=cont/method。当我看到这个,我有一种直觉,它会工作,因为它将处理“假定”的文件和目录,但不,它还没有工作。看起来我们离答案不远了…嗯,我不知道这是否会更好,但是,尝试在“RewriteEngine On”之后添加“RewriteBase/”
<VirtualHost *:*>
    ServerName test.example.com
    ServerAlias www.test.example.com
    DocumentRoot /home/sites/test/
    <Directory "/home/sites/test/">
        Allow from all
        AllowOverride All
        Options +Indexes
    </Directory>
</VirtualHost>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?do=$1 [L,QSA]
RewriteEngine On
RewriteBase /site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site/index.php?do=$1 [L,QSA]
RewriteRule ^\?(.*)\?$ /index.php?do=$1 [L,QSA]