Rewrite only if no other matching page is found

It turns out it was because the default category archive pages do not require the URL to start with /category. WordPress already matches the path /{category-slug} for the default category taxonomy archive.

I fixed it by changing the default category archive rewrite to start with /category.

function move_category_rule($rules) {
    if(array_key_exists('(.+?)/?$', $rules)) {
        $val = $rules['(.+?)/?$'];
        unset($rules['(.+?)/?$']);
        $rules['category/(.+?)/?$'] = $val;
    }
    return $rules;
}
add_filter('rewrite_rules_array', 'move_category_rule');