Apache或PHP重定向到奇怪的URL


Apache or PHP redirecting to odd URL

我正在尝试为开发测试建立一个动态应用程序服务框架。

我想要的结果是,当用户访问URL时,如果它的格式像hostname.com/somecategory/someapplicationname/hostname.com/somecategory/someapplicationname(末尾没有斜杠),那么它应该为用户提供数据库中请求的应用程序,只要类别和应用程序名称作为关键字存在。

我有一个特殊的情况,其中一些应用程序不在数据库中,并且它们存在于具有相同URL的文件中,所以我们为现有文件提供的优先级高于任何数据库记录。

使用数据库中的动态内容的情况很好。只有在末尾有斜线的情况下,现有文件的情况才能100%工作。如果没有斜杠,它将提供正确的文件,但URL看起来相当奇怪。它将显示:hostname.com/somecategory/someapplicationname/?category=somecategory&appname=someapplicationname
所以,它是有效的,但意外的输出让我觉得解决方案并不完整。

我使用的是apachemod_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);

需要明确的是,我的问题是:为什么我现有的文件案例只在URL末尾没有斜杠的情况下才将GET参数附加到URL末尾?

谢谢你抽出时间。如果您需要更多信息,请告诉我,我会提供。

您所拥有的规则并不是导致奇怪URL的原因:

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ route.php?category=$1&appname=$2 [NC,L] 

这应该没问题。在某个地方,你要么生成该链接,要么将浏览器重定向到该链接。如果你有一个看起来像这样的规则:

RewriteRule route.php /%1/%2/ [R=301,L]

您需要通过在末尾添加?来删除查询字符串:

RewriteRule route.php /%1/%2/? [R=301,L]

或者,如果您使用的是Apache 2.4,请在括号中包含一个QSD标志。

如果这还不能解决问题,您需要添加一条规则,以确保附加尾部斜杠,尽管DirectorySlash重定向可能会出现问题(您可以关闭它)。