diff --git a/CHANGES.rst b/CHANGES.rst
index ea4f70ca..215f33ed 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,3 +1,9 @@
+v11.0.1
+-------
+
+* #1627: Fixed issue in proxy tool where more than one port would
+  appear in the ``request.base`` and thus in ``cherrypy.url``.
+
 v11.0.0
 -------
 
diff --git a/cherrypy/lib/cptools.py b/cherrypy/lib/cptools.py
index 2ad5a44d..4e85c9c2 100644
--- a/cherrypy/lib/cptools.py
+++ b/cherrypy/lib/cptools.py
@@ -5,6 +5,7 @@ import re
 from hashlib import md5
 
 import six
+from six.moves import urllib
 
 import cherrypy
 from cherrypy._cpcompat import text_or_bytes
@@ -195,10 +196,8 @@ def proxy(base=None, local='X-Forwarded-Host', remote='X-Forwarded-For',
         if lbase is not None:
             base = lbase.split(',')[0]
     if not base:
-        base = request.headers.get('Host', '127.0.0.1')
-        port = request.local.port
-        if port != 80:
-            base += ':%s' % port
+        default = urllib.parse.urlparse(request.base).netloc
+        base = request.headers.get('Host', default)
 
     if base.find('://') == -1:
         # add http:// or https:// if needed

diff --git a/cherrypy/test/test_proxy.py b/cherrypy/test/test_proxy.py
index 0cb209fb..4d34440a 100644
--- a/cherrypy/test/test_proxy.py
+++ b/cherrypy/test/test_proxy.py
@@ -58,6 +58,13 @@ class ProxyTest(helper.CPWebCase):
                 return ("Browse to <a href='%s'>this page</a>."
                         % cherrypy.url('/this/new/page'))
 
+            @cherrypy.expose
+            @cherrypy.config(**{
+                'tools.proxy.base': None,
+            })
+            def base_no_base(self):
+                return cherrypy.request.base
+
         for sn in script_names:
             cherrypy.tree.mount(Root(sn), sn)
 
@@ -136,3 +143,12 @@ class ProxyTest(helper.CPWebCase):
         self.getPage('/xhost/', headers=[('X-Host', 'www.example.test')])
         self.assertHeader('Location', '%s://www.example.test/xhost'
                           % self.scheme)
+
+    def test_no_base_port_in_host(self):
+        """
+        If no base is indicated, and the host header is used to resolve
+        the base, it should rely on the host header for the port also.
+        """
+        headers = {'Host': 'localhost:8080'}.items()
+        self.getPage('/base_no_base', headers=headers)
+        self.assertBody('http://localhost:8080')

Proxy tools causes double port, creating broken links
Consider this script:

```
__requires__ = ['cherrypy']

import os

import cherrypy


class Server:
	@cherrypy.expose
	def index(self):
		return cherrypy.url('/foo/')

	@classmethod
	def run(cls):
		config = {
			'global': {
				'server.socket_port': int(os.environ.get('PORT', 8080)),
				'tools.proxy.on': True,
			},
		}
		cherrypy.quickstart(cls(), config=config)


__name__ == '__main__' and Server.run()
```

Run it and request `/` and you'll get:

```
$ curl http://localhost:8080/
http://localhost:8080:8080/foo/
```
cherrypy/test/test_proxy.py::ProxyTest::test_no_base_port_in_host
cherrypy/test/test_proxy.py::ProxyTest::testProxy cherrypy/test/test_proxy.py::ProxyTest::test_gc