diff --git a/playbooks/roles/mailman-site/templates/mailman_multihost.vhost.j2 b/playbooks/roles/mailman-site/templates/mailman_multihost.vhost.j2
index b834c276b7..71d9f40496 100644
--- a/playbooks/roles/mailman-site/templates/mailman_multihost.vhost.j2
+++ b/playbooks/roles/mailman-site/templates/mailman_multihost.vhost.j2
@@ -14,6 +14,8 @@
 RewriteEngine on
 # TODO(fungi): convert this vhost into a blanket redirect to HTTPS when ready
 RewriteRule ^/$ /cgi-bin/mailman/listinfo [R]
+RewriteCond %{HTTP_HOST} ^lists\.openstack\.org$ [nocase]
+RewriteRule /(cgi-bin/mailman/listinfo|pipermail)/(staff)(/.*|$) %{REQUEST_SCHEME}://lists.openinfra.dev/$1/$2$3 [last,redirect=permanent]
 
 # We can find mailman here:
 ScriptAlias /cgi-bin/mailman/ /usr/lib/cgi-bin/mailman/
@@ -81,6 +83,8 @@ Alias /images/mailman/ /usr/share/images/mailman/
 
   RewriteEngine on
   RewriteRule ^/$ /cgi-bin/mailman/listinfo [R]
+  RewriteCond %{HTTP_HOST} ^lists\.openstack\.org$ [nocase]
+  RewriteRule /(cgi-bin/mailman/listinfo|pipermail)/(staff)(/.*|$) %{REQUEST_SCHEME}://lists.openinfra.dev/$1/$2$3 [last,redirect=permanent]
 
   ScriptAlias /cgi-bin/mailman/ /usr/lib/cgi-bin/mailman/
   Alias /pipermail/ /srv/mailman/{{ mailman_site.name }}/archives/public/
diff --git a/testinfra/test_lists_o_o.py b/testinfra/test_lists_o_o.py
index 24ea24d0c9..df2f6ebe4a 100644
--- a/testinfra/test_lists_o_o.py
+++ b/testinfra/test_lists_o_o.py
@@ -81,6 +81,45 @@ def test_mm_list_site(host):
                    'https://lists.zuul-ci.org/cgi-bin/mailman/listinfo')
     assert '<TITLE>lists.zuul-ci.org Mailing Lists</TITLE>' in cmd.stdout
 
+def test_mm_list_site_redirect_listinfo_http(host):
+    cmd = host.run('curl '
+                   '--resolve lists.openstack.org:80:127.0.0.1 '
+                   'http://lists.openstack.org/cgi-bin/mailman/listinfo/staff')
+    assert ('The document has moved <a href="'
+            'http://lists.openinfra.dev/cgi-bin/mailman/listinfo/staff'
+            '">here</a>') in cmd.stdout
+    cmd = host.run('curl --location '
+                   '--resolve lists.openinfra.dev:80:127.0.0.1 '
+                   '--resolve lists.openstack.org:80:127.0.0.1 '
+                   'http://lists.openstack.org/cgi-bin/mailman/listinfo/staff')
+    assert '<TITLE>Staff Info Page</TITLE>' in cmd.stdout
+
+def test_mm_list_site_redirect_archives_http(host):
+    cmd = host.run('curl '
+                   '--resolve lists.openstack.org:80:127.0.0.1 '
+                   'http://lists.openstack.org/pipermail/staff/')
+    assert ('The document has moved <a href="'
+            'http://lists.openinfra.dev/pipermail/staff/'
+            '">here</a>') in cmd.stdout
+    cmd = host.run('curl --location '
+                   '--resolve lists.openinfra.dev:80:127.0.0.1 '
+                   '--resolve lists.openstack.org:80:127.0.0.1 '
+                   'http://lists.openstack.org/pipermail/staff/')
+    assert '<h1>The Staff Archives </h1>' in cmd.stdout
+
+def test_mm_list_site_redirect_archives_https(host):
+    cmd = host.run('curl --insecure '
+                   '--resolve lists.openstack.org:443:127.0.0.1 '
+                   'https://lists.openstack.org/pipermail/staff/')
+    assert ('The document has moved <a href="'
+            'https://lists.openinfra.dev/pipermail/staff/'
+            '">here</a>') in cmd.stdout
+    cmd = host.run('curl --insecure --location '
+                   '--resolve lists.openinfra.dev:443:127.0.0.1 '
+                   '--resolve lists.openstack.org:443:127.0.0.1 '
+                   'https://lists.openstack.org/pipermail/staff/')
+    assert '<h1>The Staff Archives </h1>' in cmd.stdout
+
 def test_domain_aliases(host):
     domain_aliases = host.file('/etc/aliases.domain')
     assert domain_aliases.exists