Index: trac/ticket/templates/report.rss
===================================================================
--- trac/ticket/templates/report.rss	(revision 6370)
+++ trac/ticket/templates/report.rss	(working copy)
@@ -8,9 +8,9 @@
     <link>${abs_href.report(report.id)}</link>
     <description>Trac Report - $report.description</description>
     <language>en-us</language>
-    <image py:if="chrome.logo.src">
+    <image py:if="chrome.logo.src_abs">
       <title>$project.name</title>
-      <url>$chrome.logo.src</url>
+      <url>$chrome.logo.src_abs</url>
       <link>${abs_href.report(report.id != -1 and report.id or '')}</link>
     </image>
     <generator>Trac v${trac.version}</generator>
Index: trac/ticket/templates/ticket.rss
===================================================================
--- trac/ticket/templates/ticket.rss	(revision 6370)
+++ trac/ticket/templates/ticket.rss	(working copy)
@@ -8,9 +8,9 @@
     <link>${abs_href.ticket(ticket.id)}</link>
     <description>${unicode(wiki_to_html(context, ticket.description))}</description>
     <language>en-us</language>
-    <image py:if="'src' in chrome.logo">
+    <image py:if="chrome.logo.src_abs">
       <title>$project.name</title>
-      <url>$chrome.logo.src</url>
+      <url>$chrome.logo.src_abs</url>
       <link>${abs_href.ticket(ticket.id)}</link>
     </image>
     <generator>Trac $trac.version</generator>
Index: trac/ticket/templates/query.rss
===================================================================
--- trac/ticket/templates/query.rss	(revision 6370)
+++ trac/ticket/templates/query.rss	(working copy)
@@ -8,9 +8,9 @@
     <link>$query_href</link>
     <description>$project.descr</description>
     <language>en-US</language>
-    <image py:if="chrome.logo.src">
+    <image py:if="chrome.logo.src_abs">
       <title>$project.name</title>
-      <url>$chrome.logo.src</url>
+      <url>$chrome.logo.src_abs</url>
       <link>$query_href</link>
     </image>
     <generator>Trac $trac.version</generator>
Index: trac/versioncontrol/templates/revisionlog.rss
===================================================================
--- trac/versioncontrol/templates/revisionlog.rss	(revision 6370)
+++ trac/versioncontrol/templates/revisionlog.rss	(working copy)
@@ -9,9 +9,9 @@
     <description>Trac Log - Revisions of $path</description>
     <language>en-US</language>
     <generator>Trac ${trac.version}</generator>
-    <image py:if="chrome.logo">
+    <image py:if="chrome.logo.src_abs">
       <title>${project.name}</title>
-      <url>${chrome.logo.src}</url>
+      <url>${chrome.logo.src_abs}</url>
       <link>$log_href</link>
     </image>
 
Index: trac/timeline/templates/timeline.rss
===================================================================
--- trac/timeline/templates/timeline.rss	(revision 6370)
+++ trac/timeline/templates/timeline.rss	(working copy)
@@ -9,11 +9,9 @@
     <description>Trac Timeline</description>
     <language>en-US</language>
     <generator>Trac ${trac.version}</generator>
-    <image py:if="chrome.logo.src">
+    <image py:if="chrome.logo.src_abs">
       <title>${project.name}</title>
-      <url>${
-        chrome.logo.src_abs and chrome.logo.src_abs or abs_href(chrome.logo.src)
-      }</url>
+      <url>${chrome.logo.src_abs}</url>
       <link>${abs_href.timeline()}</link>
     </image>
 
Index: trac/web/tests/chrome.py
===================================================================
--- trac/web/tests/chrome.py	(revision 6370)
+++ trac/web/tests/chrome.py	(working copy)
@@ -68,22 +68,34 @@
         self.env.config.set('header_logo', 'src', '')
         info = Chrome(self.env).prepare_request(req)
         assert 'src' not in info['logo']
+        assert 'src_abs' not in info['logo']
 
         # Test with a relative path to the logo image
         self.env.config.set('header_logo', 'src', 'foo.png')
         info = Chrome(self.env).prepare_request(req)
         self.assertEqual('/trac.cgi/chrome/common/foo.png', info['logo']['src'])
+        self.assertEqual('http://example.org/trac.cgi/chrome/common/foo.png', 
+                    info['logo']['src_abs'])
 
+        # Test with a location in project htdocs
+        self.env.config.set('header_logo', 'src', 'site/foo.png')
+        info = Chrome(self.env).prepare_request(req)
+        self.assertEqual('/trac.cgi/chrome/site/foo.png', info['logo']['src'])
+        self.assertEqual('http://example.org/trac.cgi/chrome/site/foo.png', 
+                    info['logo']['src_abs'])
+
         # Test with a server-relative path to the logo image
         self.env.config.set('header_logo', 'src', '/img/foo.png')
         info = Chrome(self.env).prepare_request(req)
         self.assertEqual('/img/foo.png', info['logo']['src'])
+        self.assertEqual('/img/foo.png', info['logo']['src_abs'])
 
         # Test with an absolute path to the logo image
         self.env.config.set('header_logo', 'src',
                             'http://www.example.org/foo.png')
         info = Chrome(self.env).prepare_request(req)
         self.assertEqual('http://www.example.org/foo.png', info['logo']['src'])
+        self.assertEqual('http://www.example.org/foo.png', info['logo']['src_abs'])
 
     def test_default_links(self):
         req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'),
Index: trac/web/chrome.py
===================================================================
--- trac/web/chrome.py	(revision 6370)
+++ trac/web/chrome.py	(working copy)
@@ -430,7 +430,7 @@
             add_link(fakereq, 'shortcut icon', src, mimetype=mimetype)
 
         # Logo image
-        chrome['logo'] = self.get_logo_data(req.href)
+        chrome['logo'] = self.get_logo_data(req.href, req.abs_href)
 
         # Navigation links
         allitems = {}
@@ -503,17 +503,25 @@
                     'mimetype': mimetype}
         return icon
 
-    def get_logo_data(self, href):
+    def get_logo_data(self, href, abs_href=None):
+        # TODO: Possibly, links to 'common/' could use chrome.htdocs_location
         logo = {}
         logo_src = self.logo_src
         if logo_src:
-            logo_src_abs = logo_src.startswith('http://') or \
-                           logo_src.startswith('https://')
-            if not logo_src.startswith('/') and not logo_src_abs:
-                if '/' in logo_src:
-                    logo_src = href.chrome(logo_src)
-                else:
-                    logo_src = href.chrome('common', logo_src)
+            abs_href = abs_href or href
+            if logo_src.startswith('http://') or \
+                    logo_src.startswith('https://') or \
+                    logo_src.startswith('/'):
+                # Nothing further can be calculated
+                logo_src_abs = logo_src
+            elif '/' in logo_src:
+                # Like 'common/trac_banner.png' or 'site/my_banner.png'
+                logo_src_abs = abs_href.chrome(logo_src)
+                logo_src = href.chrome(logo_src)
+            else:
+                # Like 'trac_banner.png'
+                logo_src_abs = abs_href.chrome('common', logo_src)
+                logo_src = href.chrome('common', logo_src)
             width = self.logo_width > -1 and self.logo_width or None
             height = self.logo_height > -1 and self.logo_height or None
             logo = {

