Setting has_archive
to true
causes WordPress to generate a rewrite rule for the archive using the rewrite slug, which is not what you want in your case. Instead, explicitly specify the archive slug as a string and the correct rules will be generated:
$args = array(
'has_archive' => 'courses',
'rewrite' => array('slug' => 'courses/%course-type%','with_front' => false),
// the rest oof fyouryour args...
);
register_post_type( 'courses', $args );