我正在尝试为开发测试建立一个动态的应用程序服务框架。
我想要的结果是,当用户访问一个 URL 时,如果它的格式类似于hostname.com/somecategory/someapplicationname/
或hostname.com/somecategory/someapplicationname
(末尾没有斜杠),它应该为用户提供数据库中请求的应用程序,只要类别和应用程序名称存在关键。
我有一个特殊情况,其中一些应用程序不在数据库中,并且它们存在于具有相同 URL 的文件中,因此我们提供现有文件的优先级高于任何数据库记录。
来自数据库的动态内容的情况很好。仅当末尾有斜线时,现有文件的大小写 100% 有效。如果斜线不存在,它将提供正确的文件,但 URL 看起来很奇怪。它会显示:hostname.com/somecategory/someapplicationname/?category=somecategory&appname=someapplicationname
所以,它有效,但意外的输出让我觉得解决方案不完整。
我正在使用 apache mod_rewrite,我的 .htaccess 文件如下:
RewriteEngine on
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ route.php?category=$1&appname=$2 [NC,L]
特定于此案例的 PHP 代码如下。为了便于阅读,我从这个片段中删除了验证和数据库连接,但是保留了这个特殊情况的逻辑。
$file = $_SERVER['DOCUMENT_ROOT'] . $_GET['category'] . "/" . $_GET['appname'] . "/index.php";
$fileNoPHP = $_SERVER['DOCUMENT_ROOT'] . $_GET['category'] . "/" . $_GET['appname'] . "/index.html";
$_fileExists = file_exists($file);
$_fileNoPHPExists = file_exists($fileNoPHP);
include_once($_fileExists ? $file : $fileNoPHP);
需要明确的是,我的问题是:为什么我现有的文件案例将 GET 参数附加到 URL 的末尾,仅当末尾的斜杠不存在时?
谢谢你的时间。如果您需要更多信息,请告诉我,我会提供。