--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -20,7 +20,7 @@
 import logging
 import re
 import difflib
-from urllib import quote, unquote
+from urllib import quote, unquote, quote_plus
 from collections import defaultdict
 from itertools import islice
 
@@ -459,24 +459,24 @@
             result.update(self._commit.context())
         return result
 
-    @require_post()
     @expose('jinja:allura:templates/repo/tarball.html')
     def tarball(self, **kw):
-        path = kw.pop('path', None)
+        path = request.params.get('path')
         if not asbool(tg.config.get('scm.repos.tarball.enable', False)):
             raise exc.HTTPNotFound()
         rev = self._commit.url().split('/')[-2]
         status = c.app.repo.get_tarball_status(rev, path)
-        if status is None:
+        if status is None and request.method == 'POST':
             allura.tasks.repo_tasks.tarball.post(revision=rev, path=path)
-        return dict(commit=self._commit, revision=rev, status=status)
+            redirect('tarball' + '?path={0}'.format(path) if path else '')
+        return dict(commit=self._commit, revision=rev, status=status or 'na')
 
     @expose('json:')
     def tarball_status(self, path=None, **kw):
         if not asbool(tg.config.get('scm.repos.tarball.enable', False)):
             raise exc.HTTPNotFound()
         rev = self._commit.url().split('/')[-2]
-        return dict(status=c.app.repo.get_tarball_status(rev, path))
+        return dict(status=c.app.repo.get_tarball_status(rev, path) or 'na')
 
 
     @expose('jinja:allura:templates/repo/log.html')