PHP 7.1干净的URL

时间:2019-01-02 08:48:59

标签: php clean-urls

我有一个完全像这样的index.php

echo "<h2>index page</h2>";
$url=explode("/",$_SERVER['QUERY_STRING']);
echo "<pre>";
print_r($url);
print_r($_SERVER['QUERY_STRING']);
echo "</pre>";

和另一个在同一文件夹中的profile.php使用相同的代码

echo "<h2>profile page</h2>";
$url=explode("/",$_SERVER['QUERY_STRING']);
echo "<pre>";
print_r($url);
print_r($_SERVER['QUERY_STRING']);
echo "</pre>";

我正在尝试使用干净的url建立一个非常简单的路由系统。 当网址是这样的http://localhost/vas/aaa/bbb时 我从index.php得到以下结果,这是可以的:

索引页面 数组 (     [0] => aaa     1 => bbb ) aaa / bbb

printscreen image of index

但是,当我键入以下内容:http://localhost/vas/profile/john/21时,我将配置文件包含在url中,作为该URL的第一部分,我得到了:

个人资料页面 数组 (     [0] => )

printscreen image of profile

这意味着无论我进行任何形式的路由,都运行profile.php,结果是一个空的url数组,没有-最重要的-预期参数,例如约翰/ 21。 为什么将路由作为功能嵌入在PHP 7. *中呢? 这是我的.htaccess文件:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?$1 [QSA,L]

2 个答案:

答案 0 :(得分:0)

我建议您使用 parse_url()函数以及将所有请求路由到Apache中的 index.php 的方式

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

答案 1 :(得分:0)

您当前的.htaccess的一些解释:

前两行设置了url重写的条件,在这种情况下,如果未在url中找到指定的文件夹或文件,它将被重写:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

然后,重写规则指定所传递的URL应该作为查询字符串传输到index.php

RewriteRule ^(.*)$ index.php?$1 [QSA,L]

因此,如果您没有其他.htaccess规则,则在调用此URL http://localhost/vas/profile/john/21时,您不应以profile.php结尾,因为您没有在网址。您应该以网址作为参数以index.php结尾。

但是,如果文件夹vas/profile/john/21/实际上存在并且其中有一个index.php,则将调用该文件,但是由于重写将不适用,因此您将没有查询字符串。

这里可能还发生了其他事情,其他.htacces规则将/profile/重定向到profile.php或什么,这说明您可以正确访问此文件。额外的信息可能会有用。