重定向不适用于 .htaccess 文件

Redirection not working with .htaccess file

我正在使用 htaccess 从 URL 中隐藏 GET 变量。我有问题。我的项目结构是这样的:

--project

  index.php

  /views

    login.php

    example.php

    /user

      dashboard.php

因此,当我使用类似“localhost/project/login”的内容时,我被正确地重定向到 login.php 页面。但是当我执行类似“localhost/project/user/dashboard”的操作时,我得到了 Apache 生成的 404 Not Found 响应。

这就是我在 PHP 中用来包含带有 GET 变量的页面的内容:

PHP代码:

<?php
if(isset($_GET['page'])) {
$page = $_GET['page'].'.php';
if(is_file('views/'.$page)) {
    include 'views/'.$page;
} else {
    echo 'Page does not exist';
}
?>

htaccess 文件:

RewriteEngine on
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?page= [NC]

有人可以给我一些指导吗?我没有使用 .htaccess 文件的经验

RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?page= [NC]

我假设您的 .htaccess 文件位于 /project 子目录中(因为 localhost/project/login URL 会被您的 PHP代码)。

然而,RewriteRule 指令中的正则表达式与请求 localhost/project/user/dashboard 不匹配,因为正则表达式不匹配 user/dashboard 因为正则表达式不允许斜杠(除了在URL-path 结束)。因此,请求只是直接进入 Apache 404。

您需要在 RewriteRule 模式 中允许使用斜杠,您可以通过在字符 class 中包含一个斜杠来实现。例如:

RewriteRule ^([/A-Za-z0-9-]+?)/?$ index.php?page= [L]

需要制作 + 量词 non-greedy 以免消耗可选的尾部斜杠。

注意:这里不需要 NC 标志,但需要 L 标志(如果您稍后添加更多指令)。