Yii2:漂亮的URL规则允许URL中的垃圾数据

时间:2016-09-24 11:10:48

标签: javascript url-rewriting datatables yii2

我在我的项目中使用URL重写规则和URL管理器。这是我的URLManager规则的代码:

        'rules' => [
            '/'=>'site/index',
            '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
            '<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin|driver|user)>' => '<module>/<controller>/<action>',
            '<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin|driver|user)>/<id:\d+>' => '<module>/<controller>/<action>',
            '<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin|driver|user)>/<_:\w+>' => '<module>/<controller>/<action>',
        ],

问题是DataTables正在使用URL ?_=1474714889055中的额外参数发送数据,这会搞乱一切。我添加了最后一行代码以允许此参数或Datatable添加的任何其他垃圾数据。

如何删除此代码或允许它在URL中而不影响路由?

此致

编辑:

public function actionVerified()
{
    Yii::$app->response->format = Response::FORMAT_JSON;
    $expression = new \yii\db\Expression('CONCAT(`driver_details`.`first_name`, " ", `driver_details`.`last_name`) as `driver_name`');
    $bookings = \app\models\Bookings::find()
    ->select(["bookings.*",
        "TIME_FORMAT(booking_start, '%h:%i %p') as booking_start",
        "TIME_FORMAT(booking_end, '%h:%i %p') as booking_end",
        "users_main.name as verified_by_name",
        "user_details.name as booked_by", 
        "user_details.contact as contact", 
        new \yii\db\Expression("CONCAT('STARWAY-BKNG-',bookings.id) as id_show"),
        $expression
    ])->joinWith('userDetail')
    ->joinWith('driverDetail')
    ->joinWith('usersMain')
    ->where(['verified'=>1, 'canceled'=> 0, 'completed'=>0])->asArray()->all();
    foreach ($bookings as $key => $booking) {
        unset($booking['userDetail']);
        unset($booking['driverDetail']);
        unset($booking['usersMain']);
        $booking_send[] = $booking;
    }
    if(!isset($booking_send)){
        $booking_send = [];
    }
    return $booking_send;
}

1 个答案:

答案 0 :(得分:1)

我想我知道你为什么会收到404错误。它是最后一个&#39; /&#39;部分,就在之前&#39;?_ = 147471488 9055&#39;,这导致了404.

根据Yii2,这两个网址不同:

// these two are not same
http://domain.com/controller/action
http://domain.com/controller/action/

如果只是使用trailing slash进行搜索,您会在Yii Github Issues页面上找到几个讨论。

我不知道最后/来自哪里,所以我检查了DataTables Documentation,但没有找到任何最后的&#39} /&#39;在他们的示例代码或ajax url:

// their ajax code 
$(document).ready(function() {
    $('#example').DataTable( {
        "ajax": '../ajax/data/arrays.txt'
    } );
} );

// ajax url being called in their example page
https://datatables.net/examples/ajax/data/arrays.txt?_=1474729703286

所以我猜测你的源代码上可能有一个类型,即最后添加/。解决这个问题应该解决你的问题。

如果不是这样,您可以尝试在配置中使用以下规则:

'rules' => [
    '/'=>'site/index',
    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
    '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
    '<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin|driver|user)>' => '<module>/<controller>/<action>',
    '<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin\/|driver\/|user\/)>' => '<module>/<controller>/<action>', // allow the trailing slash 
    '<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin|driver|user)>/<id:\d+>' => '<module>/<controller>/<action>',
],

虽然您当前的解决方案有效,但我不建议

'<module:\w+>/<controller:\w+>/<action:\w+>/<type:(admin|dri‌​ver|user)>/<_:\*?>' => '<module>/<controller>/<action>'

此规则因为它不正确。 <_:\*?>部分表示还允许使用以下网址:

// .......................................^ these are definitely not valid.
YOUR_DOMAIN/module/controller/action/type/*
YOUR_DOMAIN/module/controller/action/type/?
YOUR_DOMAIN/module/controller/action/type/*?
YOUR_DOMAIN/module/controller/action/type/?*

我希望你明白我的观点。

最后,我只是使用像.htaccess文件这样的标准wordpress。这是以下情况:

# BEGIN WordPress
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
# END WordPress