如何处理干净的URL和查询?

时间:2013-12-08 18:10:12

标签: php apache .htaccess mod-rewrite clean-urls

我决定使用干净的网址构建一个Web应用程序。然而,起初它似乎很难。我在测试过程中遇到了很多问题,我无法弄清楚如何建议基本构建Clean URL。

我最终决定将所有内容重定向到index.php并从那里处理URI。

这是我的.htaccess文件:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php?url=$0 [QSA]

在PHP端我创建了这个,所以只传递数组中的URL:

    $root_path = '/';

    $uri = $_SERVER['REQUEST_URI'];
    $url = array(
        $root_path . 'login' => 'login'
        );
    $url_basic = array_keys($url);
    $url_slash = array_keys($url);
    array_walk($url_slash, function(&$value, $key) { $value .= '/'; return $value;});

    if (in_array($uri, $url_basic) || in_array($uri, $url_slash)) {
        $uri = rtrim($uri,'/');
        require $url[$uri] . '.php';
        exit();
    }   else {
        echo 'Bad';
    }

所以基本上如果有人输入:/ login或/ login /他们将需要login.php,否则他们将留在index.php页面上(因为APACHE重定向其他所有内容)。

问题:

假设用户在尝试登录时收到了错误。在这种情况下,我想最好的方式(或者如果不是最好的方法,请告诉我)传递一个名为'的$ _GET变量错误'例如。因此,用户将获得:/login/?error=1

如何才能实现这一结果?因为如果我键入,我会被重定向到index.php页面。谁能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

您可以在$ _SERVER ['REQUEST_URI']中剪切查询字符串时查看$ _SERVER ['QUERY_STRING']:

if ($_SERVER['QUERY_STRING'])   
    echo substr($_SERVER['REQUEST_URI'], 0, -strlen($_SERVER['QUERY_STRING']) - 1);

-1也可以删除问号。

但是没有必要在GET中设置错误。您可以使用Flash消息并将错误存储在会话中。您可以找到一种使用它们的简单方法here

答案 1 :(得分:0)

也许您应该考虑使用

的路由系统

Symfony:http://symfony.com/doc/current/book/routing.html 或者它的苗条对手

Silex:http://silex.sensiolabs.org/doc/usage.html#routing