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

Cog*_*ero 4 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');
Run Code Online (Sandbox Code Playgroud)

然后索引页面(上面的源代码)将此 $controllerAction 传递到 main.php 文件,该文件自动加载主控制器,然后加载请求的控制器。

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

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

RewriteEngine On
RewriteRule ^([^/]*)$ /?do=$1 [L]
Run Code Online (Sandbox Code Playgroud)

有人建议我可以使用 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>
Run Code Online (Sandbox Code Playgroud)

文件结构(Windows):

D:\
--sites
----mysite.com
--------@client_details
--------root
-----------@devfiles
-----------@vars_pwd
-----------wwwroot
--------------config
--------------core
--------------application
------------------controllers
------------------libraries
------------------models
------------------views
----------------------css
----------------------javascript
----------------------images
----------------------icons
Run Code Online (Sandbox Code Playgroud)

sve*_*ens 5

首先,你的.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]
Run Code Online (Sandbox Code Playgroud)

您可能会感到惊讶,因为这与其他人发布的内容或多或少相同。我在我的许多项目中使用了类似的东西,并且我刚刚测试过它,我可以保证它有效。你的apache配置肯定有问题。

当您遇到问题时mod_rewrite,您应该尝试的第一件事是启用模块本身。以 root 身份在 shell 中输入以下命令:

a2enmod rewrite
/etc/init.d/apache2 restart
Run Code Online (Sandbox Code Playgroud)

第一个激活模块(或者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>
Run Code Online (Sandbox Code Playgroud)

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

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