如何使用$ _GET与mod_rewrite和AltoRouter

时间:2015-05-27 17:30:47

标签: php .htaccess mod-rewrite routes

我在启用mod_rewrite的情况下获取$ _GET变量时出现问题。我有以下.htaccess:

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

我使用“AltoRouter”进行路由。

因此,我可能拥有的路线示例/login?redirect=localhost%2Fnetwork%2Fdashboard将被重写为/login

我要做的是获取$_GET['redirect']而我似乎无法做到这一点。有人可以帮忙吗?提前为一些代码转储道歉。

4 个答案:

答案 0 :(得分:0)

您不会继续在AltoRouter中使用$ _GET。 查看herehere

您的问题可能是您不是generating URLs通过AltoRouter。

Alto Router称之为“反向路由” - 请查看源代码:

/**
 * Reversed routing
 *
 * Generate the URL for a named route. Replace regexes with supplied parameters
 *
 * @param string $routeName The name of the route.
 * @param array @params Associative array of parameters to replace placeholders with.
 * @return string The URL of the route with named parameters in place.
 */
public function generate($routeName, array $params = array()) {

在URL中获取params的方法:

$router = new AltoRouter();
$router->map( 'GET', '/', function() { .. }, 'home' );

// assuming current request url = '/'
$match = $router->match();

/*
array(3) { 
    ["target"]  => object(Closure)#2 (0) { } 
    ["params"]  => array(0) { } 
    ["name"]    => 'home' 
}
*/

另一个例子

$router = new AltoRouter();

// map homepage
$router->map( 'GET', '/', function() {
    require __DIR__ . '/views/home.php';
});

// map user details page
$router->map( 'GET', '/user/[i:id]/', function( $id ) {
    require __DIR__ . '/views/user-details.php';
});

// match current request url
$match = $router->match();

// call closure or throw 404 status
if( $match && is_callable( $match['target'] ) ) {
    call_user_func_array( $match['target'], $match['params'] ); 
} else {
    // no route was matched
    header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}

答案 1 :(得分:0)

这个功能帮助了我:

public static function _GET(){
    $__GET = array();
    $ru = $_SERVER['REQUEST_URI'];
    $_get_str = explode('?', $ru);
    if( !isset($_get_str[1]) ) return $__GET;
    $params = explode('&', $_get_str[1]);
    foreach ($params as $p) {
        $parts = explode('=', $p);
        $__GET[$parts[0]] = isset($parts[1])? $parts[1] : '';
    }
    return $__GET;
}

$__GET = App::_GET();
$url = urldecode( $__GET['redirect'] )

答案 2 :(得分:0)

老问题,但你可以用$ _GET获得GET变量,但是你必须仍然匹配路线。即,如果路线不匹配,则脚本不会继续。

altorouter中的路线:

/login?redirect=localhost%2Fnetwork%2Fdashboard

会(如果你愿意,可以使用GET或POST):

$router->map('GET|POST','/login/*', 'controllerforthisroute', "login");

您可以<?php echo $_GET['redirect'] ?>后获得:

localhost/network/dashboard

答案 3 :(得分:0)

老问题,但是处理Altorouter和查询字符串参数似乎并不容易。

正如作者here所述,不适合在Altorouter的$match['parameters']中输出查询字符串参数来遵守REST原则。

查询字符串参数必须作为外部数据而不是Altorouter数据的一部分受到威胁。


这是一个简单的解决方案,用于在PHP全局$_GET中检索URL查询字符串和注册参数:

// Register URL query string parameters in $_GET since Altorouter ROUTE doesn't deal with these.
$parts = parse_url($_SERVER['REQUEST_URI']);
if (isset($parts['query'])) {
    parse_str($parts['query'], $_GET);
}

// now we can use $_GET
// echo $_GET['something'];