Apache htaccess mod使用PHP索引页面中的Controller GET变量重写重定向

时间:2011-03-17 09:54:24

标签: php mod-rewrite

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

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问题):(

RewriteEngine On
RewriteRule ^([^/]*)$ /?do=$1 [L]

有人建议我可以使用PHP来做到这一点,但我不知道该怎么做。

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

进一步编辑

(请注意其他虚拟主机在我的localhost上运行正常):

(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>

文件结构(Windows):

D:\
--sites
----mysite.com
--------@client_details
--------root
-----------@devfiles
-----------@vars_pwd
-----------wwwroot
--------------config
--------------core
--------------application
------------------controllers
------------------libraries
------------------models
------------------views
----------------------css
----------------------javascript
----------------------images
----------------------icons

6 个答案:

答案 0 :(得分:4)

首先,您的.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

第一个激活模块(如果一切正常,则向Module rewrite already enabled投诉),第二个重启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>

请注意,如果更改了Apache中的任何内容,则必须重新启动Apache。

如果这一切都无济于事,那么查看错误日志总是一个好主意。在我的系统中,它们位于/var/log/apache2/error.log(debian)。他们可能会为您提供有关出错的更多信息。

答案 1 :(得分:2)

尝试

RewriteEngine On
RewriteRule ^([^/]*)$ index.php?do=$1 [L]

答案 2 :(得分:2)

尝试

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?do=$1 [L]

答案 3 :(得分:2)

检查您的apache日志,具体访问日志。如果文件夹存在于Web根目录中,那么您应该可以直接访问它:)。您可能还想检查是否有相同站点的重复虚拟主机条目。

答案 4 :(得分:2)

这是我定制的MVC框架,它基于cake

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

可能这应该有所帮助。此site.com/controller/method

的典型网址格式

答案 5 :(得分:1)

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

如果您的代码位于文件夹的根目录中,并且索引文件名为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 /更改为您的文件夹)。

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

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

  • 通过选中AllowOverride设置为all,确保您的网站允许处理.htaccess文件。如果您无法访问必要的配置文件以进行检查,则一个简单的测试是设置.htaccess规则以重定向到系统上的虚拟文件。如果它有效,那么你的.htaccess正在被执行。
  • 查看您的MVC框架,了解它实际发送请求的页面。问题可能是您没有为该特定请求定义处理程序,并且您的MVC框架的默认操作是抛出404错误。

修改:只是阅读您的说明,我注意到您说网址应该基本上类似于mysite.com/?do=controller/method/variable。如果它对这种格式非常严格,那么你还需要输入删除任何前导或尾部斜杠的规则,例如:以下重写规则应该这样做:

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

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