Advanced permalinks structure

WordPress is practically setup to support this out of the box. You can go to mysite.com/?category_name=news&tag=sports to see the magic happen. All we need to do here is match a permalink structure to this existing URI, and WP makes this unreasonably easy.

In your theme’s functions.php file, add:

add_action( 'init', 'wpse_88059_add_rewrites' );
function wpse_88059_add_rewrites() {
    add_permastruct( 'category_tags', '%category%/%post_tag%', array( 'walk_dirs' => false ) );
}

Now be sure to reload your rewrite rules by going to Settings -> Permalinks and clicking “Save Changes” (you don’t have to actually change anything) and you’re done!

Caveats

This is going to add some “wildcard” rewrite rules which can easily interfere with others, depending on your site’s content, permalink structure, etc. For instance, let’s say your permalink structure is “Day and name”, which adds rules for year/month archive pages like /2013/02/. These links will no longer work because WordPress is expecting to find a category of “2013” and a tag of “02”.

This is why WordPress typically prefixes elements, like /category/news/. Depending on your needs, these conflicts may be a dealbreaker or may be moot, that’s up to you and your project. If you want to add a static prefix (or suffix), you could change %category%/%post_tag% to something like archives/%category%/%post_tag% to get URIs like /archives/news/sports/ or %category%/%post_tag%/articles to get URIs like /news/sports/articles/.