diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py
index de924a3..724b74d 100644
--- a/django/utils/feedgenerator.py
+++ b/django/utils/feedgenerator.py
@@ -21,6 +21,7 @@ http://diveintomark.org/archives/2004/02/04/incompatible-rss
 
 import re
 import datetime
+from urlparse import urlparse
 from django.utils.xmlutils import SimplerXMLGenerator
 from django.utils.encoding import force_unicode, iri_to_uri
 
@@ -47,11 +48,9 @@ def rfc3339_date(date):
 
 def get_tag_uri(url, date):
     "Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"
-    tag = re.sub('^http://', '', url)
-    if date is not None:
-        tag = re.sub('/', ',%s:/' % date.strftime('%Y-%m-%d'), tag, 1)
-    tag = re.sub('#', '/', tag)
-    return u'tag:' + tag
+    url_split = urlparse(url)
+    tagging_entity = "%s,%s:" % (url_split.hostname, date.strftime('%Y-%m-%d'))
+    return u'tag:%s%s/%s' % (tagging_entity, url_split.path, url_split.fragment)
 
 class SyndicationFeed(object):
     "Base class for all syndication feeds. Subclasses should provide write()"
diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py
index 485c5fa..b38888c 100644
--- a/tests/regressiontests/utils/tests.py
+++ b/tests/regressiontests/utils/tests.py
@@ -9,6 +9,7 @@ from django.utils import html, checksums
 import timesince
 import datastructures
 import itercompat
+import feedgenerator
 from decorators import DecoratorFromMiddlewareTests
 
 # We need this because "datastructures" uses sorted() and the tests are run in
@@ -23,6 +24,7 @@ __test__ = {
     'timesince': timesince,
     'datastructures': datastructures,
     'itercompat': itercompat,
+    'feedgenerator': feedgenerator,
 }
 
 class TestUtilsHtml(TestCase):
