【问题标题】:How to process Clean URLs and Queries?如何处理干净的 URL 和查询?
【发布时间】:2013-12-08 18:10:11
【问题描述】:

我决定使用干净的 url 构建一个 Web 应用程序。然而,起初它似乎很难。我在测试过程中遇到了很多问题,我基本上不知道建议如何构建干净的 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 页面。谁能帮帮我吗?

【问题讨论】:

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


    【解决方案1】:

    你可以看看 $_SERVER['QUERY_STRING'] at cut the query string out of $_SERVER['REQUEST_URI']:

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

    -1 也用于删除问号。

    但不需要在 GET 中设置错误。您可以使用 Flash 消息并将错误存储在会话中。你可以找到一个简单的方法来使用它们here

    【讨论】:

      【解决方案2】:

      也许你应该考虑使用路由系统

      Symfony:http://symfony.com/doc/current/book/routing.html 或者更纤细的对应物

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

      【讨论】:

        猜你喜欢
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多