【问题标题】:PHP routing not including filesPHP路由不包括文件
【发布时间】:2021-05-02 16:19:56
【问题描述】:

我为 PHP 尝试了一个简单的路由,但我快疯了,因为它没有完全工作......
希望任何人都可以提供帮助。这是我第一次尝试用 PHP 编写自己的路由。

问题

当我请求“SERVER-IP/hms/routing/test”时,它会显示 home.php 的内容 - 好的

当我请求“SERVER-IP/hms/routing/shop”时,它显示 404-error.... - 为什么??
一旦我在服务器上删除“shop.php”,它就会显示我的 index.php

请求:/hms/routing/shop
网址:/shop

不知道为什么它没有正确加载文件...
知道为什么它不起作用吗? :(

我的 .htaccess

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

我的 index.php

<?php

$request = $_SERVER['REQUEST_URI'];

echo "Request:".$request."<br>";

$url = str_replace("/hms/routing","", $request);

echo "URL: ".$url."<br>";

switch ($url) {
    case "/":
        include "home.php";
        break;
        
    case "/about":
        include "about.php";
        break;
        
    case "/test":
        include "home.php";
        break;
        
    case "/shop":
        include "shop.php";
        break;
        
}
?>

提前非常感谢! :)

【问题讨论】:

  • 我希望你的shop.php` file exist on the same folder structure as index.php`` 文件?另外,您能否在将URL 传递给SWITCH 之前修剪它,因为可能存在一些未请求的空格?
  • shop.php 中有什么?它似乎包含它,否则您会从 index.php 中看到 echo。可能有重定向或其他情况导致 shop.php 上的 404。其他建议:删除 index.php 和其他包含文件最后一行的 php 结束标记,因为已知它会导致问题。更改 include "shop.php"; 以支持将 require_once 与绝对路径 require_once __DIR__ . '/shop.php'; 一起使用,以确保文件存在于完全限定的路径中或将发出错误并且仅包含一次,从而防止循环引用。
  • 嗨。是的,所有文件都在同一个文件夹中。我还添加了$url = trim($url);,但没有任何效果。
  • 我已从 include... 更改为 require_once(__DIR__ . "/shop.php"); 但仍然是同样的问题。我还从 index.php 中删除了 ?&gt;
  • 如果您在使用 require_once 时没有看到 PHP 错误,该文件不存在,那么 index.php 正在加载 shop.php 并且您的问题是由 shop.php 脚本引起的。我的其他建议是提高性能和减少潜在问题的代码质量建议。注意:requireinclude 等不是函数调用,不需要括号,使用括号会导致 PHP 词法分析器额外的解析时间。

标签: php apache url-routing


【解决方案1】:

终于成功了!
感谢 Will B.,解决方案如下:

.htaccess

Options -MultiViews
RewriteEngine On
RewriteBase /hms/routing
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [L,QSA]

index.php

<?php

$request = $_SERVER['REQUEST_URI'];

echo "Request:".$request."<br>";

$url = str_replace("/hms/routing","", $request);
$url = trim($url);

echo "URL: ".$url."<br>";
echo "Complete: ". __DIR__ . $url.".php<br>";


switch ($url) {
    case "/":
        require_once __DIR__ . '/home.php';
        break;
        
    case "/about":
        require_once __DIR__ . '/about.php';
        break;
        
    case "/test":
        require_once  __DIR__ . '/home.php';
        break;
        
    case "/shop":
        require_once __DIR__ . '/shop.php';
        break;
        
}

我认为最终有帮助的是 .htaccess 中的 Options -MultiViews

非常感谢您的帮助! :)

【讨论】:

  • 请注意Options -MultiViews 要在您的.htaccess 文件中工作,Apache VirtualHost 配置必须设置为AllowOverride All 或至少AllowOverride Options=MultiViews 以用于@ 的&lt;Directory&gt; 路径987654329@,例如:&lt;Directory "/hms/routing"&gt;AllowOverride All&lt;/Directory&gt;
猜你喜欢
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多