You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ep...@apache.org on 2023/08/05 19:40:48 UTC

[solr] branch main updated: SOLR-16911: Remove ability to change hostContext, keep it as /solr (#1810)

This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 9c911e7337c SOLR-16911: Remove ability to change hostContext, keep it as /solr (#1810)
9c911e7337c is described below

commit 9c911e7337cd1026accc1a825e26906039982328
Author: Eric Pugh <ep...@opensourceconnections.com>
AuthorDate: Sat Aug 5 15:40:42 2023 -0400

    SOLR-16911: Remove ability to change hostContext, keep it as /solr (#1810)
    
    * add warning if a user has a hostContext defined in solr.xml.
    * eradicates all usage of hostContext in the code, replacing it with hardcoded /solr.
    * remove randomization of hostContext in tests that extend BaseDistributedSearchTestCase
---
 solr/CHANGES.txt                                   |  4 +-
 .../apache/solr/bench/lifecycle/SolrStartup.java   |  6 +-
 solr/benchmark/src/resources/solr.xml              |  5 +-
 .../java/org/apache/solr/cloud/ZkController.java   | 38 +--------
 .../src/java/org/apache/solr/core/CloudConfig.java | 19 -----
 .../java/org/apache/solr/core/SolrXmlConfig.java   | 18 ++--
 solr/core/src/test-files/solr/solr-50-all.xml      |  1 -
 solr/core/src/test-files/solr/solr-jmxreporter.xml |  1 -
 solr/core/src/test-files/solr/solr-stress-new.xml  |  1 -
 .../test-files/solr/solr-trackingshardhandler.xml  |  1 -
 solr/core/src/test-files/solr/solr.xml             |  5 +-
 .../org/apache/solr/TestSolrCoreProperties.java    |  2 +-
 .../org/apache/solr/cli/TestSolrCLIRunExample.java |  4 +-
 .../solr/cloud/ChaosMonkeyShardSplitTest.java      |  2 +-
 .../solr/cloud/ClusterStateMockUtilTest.java       |  4 +-
 .../cloud/ConcurrentCreateRoutedAliasTest.java     |  2 +-
 .../solr/cloud/CreateCollectionCleanupTest.java    |  1 -
 .../org/apache/solr/cloud/LeaderElectionTest.java  |  4 +-
 .../org/apache/solr/cloud/NodeMutatorTest.java     |  6 +-
 .../test/org/apache/solr/cloud/OverseerTest.java   |  4 +-
 .../org/apache/solr/cloud/SSLMigrationTest.java    |  1 -
 .../org/apache/solr/cloud/SolrXmlInZkTest.java     |  1 -
 .../solr/cloud/TestConfigSetsAPIExclusivity.java   |  2 +-
 .../solr/cloud/TestConfigSetsAPIZkFailure.java     |  2 +-
 .../solr/cloud/TestLeaderElectionZkExpiry.java     |  2 +-
 .../apache/solr/cloud/TestRequestForwarding.java   |  2 +-
 .../apache/solr/cloud/TestSSLRandomization.java    |  4 +-
 .../cloud/TestWaitForStateWithJettyShutdowns.java  |  4 +-
 .../org/apache/solr/cloud/ZkControllerTest.java    | 82 +++++-------------
 .../ConcurrentDeleteAndCreateCollectionTest.java   |  2 +-
 .../LocalFSCloudIncrementalBackupTest.java         |  1 -
 .../org/apache/solr/core/TestCoreDiscovery.java    |  1 -
 .../src/test/org/apache/solr/core/TestSolrXml.java | 12 +--
 .../solr/handler/PingRequestHandlerTest.java       |  2 +-
 .../apache/solr/handler/ReplicationTestHelper.java |  2 +-
 .../handler/TestHealthCheckHandlerLegacyMode.java  | 17 ++--
 .../solr/handler/TestReplicationHandler.java       | 20 ++---
 .../solr/handler/TestReplicationHandlerBackup.java |  8 +-
 .../org/apache/solr/handler/TestRestoreCore.java   |  5 +-
 .../org/apache/solr/handler/V2StandaloneTest.java  |  4 +-
 .../solr/handler/admin/CoreAdminHandlerTest.java   |  9 +-
 .../solr/handler/admin/DaemonStreamApiTest.java    |  2 +-
 .../handler/component/CloudReplicaSourceTest.java  | 35 ++++----
 .../solr/handler/component/SearchHandlerTest.java  |  6 +-
 .../apache/solr/response/TestRawTransformer.java   |  2 +-
 .../apache/solr/search/stats/TestDistribIDF.java   |  2 +-
 .../solr/security/BasicAuthStandaloneTest.java     |  5 +-
 .../apache/solr/security/MultiAuthPluginTest.java  |  2 +-
 .../apache/solr/update/SolrCmdDistributorTest.java |  2 +-
 .../apache/solr/gcs/GCSIncrementalBackupTest.java  |  1 -
 .../hadoop/TestSolrCloudWithDelegationTokens.java  |  2 +-
 .../TestSolrCloudWithSecureImpersonation.java      |  2 +-
 .../org/apache/solr/hdfs/HdfsDirectoryFactory.java | 24 ++++--
 .../HdfsCloudIncrementalBackupTest.java            |  1 -
 .../collections/TestHdfsCloudBackupRestore.java    |  1 -
 .../hdfs/handler/TestHdfsBackupRestoreCore.java    |  1 -
 solr/modules/ltr/src/test-files/solr/solr.xml      |  1 -
 .../org/apache/solr/ltr/TestLTROnSolrCloud.java    |  2 +-
 .../opentelemetry/src/test-files/solr/solr.xml     |  3 +-
 .../apache/solr/s3/S3IncrementalBackupTest.java    |  1 -
 .../src/test-files/solr/solr.xml                   |  1 -
 solr/server/solr/solr.xml                          |  1 -
 .../pages/configuring-solr-xml.adoc                | 10 ---
 .../src/test-files/solrj/solr/solr.xml             |  1 -
 .../java/org/apache/solr/common/util/Utils.java    |  4 +-
 .../src/test-files/solrj/solr/shared/solr.xml      |  1 -
 solr/solrj/src/test-files/solrj/solr/solr.xml      |  1 -
 .../solr/client/solrj/TestLBHttp2SolrClient.java   |  5 +-
 .../solr/client/solrj/TestLBHttpSolrClient.java    |  5 +-
 .../client/solrj/embedded/JettyWebappTest.java     |  9 +-
 .../solrj/impl/TestCloudSolrClientConnections.java | 10 +--
 .../apache/solr/BaseDistributedSearchTestCase.java | 98 ++--------------------
 .../java/org/apache/solr/SolrJettyTestBase.java    |  1 -
 .../src/java/org/apache/solr/SolrTestCaseHS.java   |  1 -
 .../src/java/org/apache/solr/SolrTestCaseJ4.java   | 11 +--
 .../solr/cloud/AbstractFullDistribZkTestBase.java  |  3 -
 .../apache/solr/cloud/MiniSolrCloudCluster.java    | 74 ++--------------
 .../api/collections/AbstractInstallShardTest.java  |  1 -
 .../java/org/apache/solr/embedded/JettyConfig.java | 11 ---
 .../org/apache/solr/embedded/JettySolrRunner.java  | 14 ++--
 .../src/java/org/apache/solr/util/TestHarness.java |  4 +-
 .../solr/cloud/MiniSolrCloudClusterTest.java       | 12 +--
 .../apache/solr/embedded/TestJettySolrRunner.java  |  2 +-
 83 files changed, 191 insertions(+), 495 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 0745371a5ea..2c5b3ccbf8d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -57,7 +57,9 @@ Other Changes
 
 * SOLR-16892: bin/solr create command supports both standalone and cloud modes, and deprecate create_core and create_collection commands.   (Eric Pugh)
 
-* SOLR-16822: Change meaning of -h from shorhand for -host to instead return help information for bin/solr start and restart commands. (Eric Pugh)
+* SOLR-16822: Change meaning of -h from shorthand for -host to instead return help information for bin/solr start and restart commands. (Eric Pugh)
+
+* SOLR-16911: Establish /solr as the only host context supported by Solr, removing legacy ability to change this.  Solr paths will only be either /solr or /api now.  (Eric Pugh)
 
 ==================  9.4.0 ==================
 New Features
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/lifecycle/SolrStartup.java b/solr/benchmark/src/java/org/apache/solr/bench/lifecycle/SolrStartup.java
index 6924d3d604d..d0bd64d56ba 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/lifecycle/SolrStartup.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/lifecycle/SolrStartup.java
@@ -76,7 +76,7 @@ public class SolrStartup {
           Path.of("src/resources/configs/minimal/conf"), defaultConfigsetDir.resolve("conf"));
       PathUtils.copyFileToDirectory(Path.of("src/resources/solr.xml"), tmpSolrHome);
 
-      solrRunner = new JettySolrRunner(tmpSolrHome.toString(), buildJettyConfig("/solr"));
+      solrRunner = new JettySolrRunner(tmpSolrHome.toString(), buildJettyConfig());
       solrRunner.start(false);
       try (SolrClient client = solrRunner.newClient()) {
         for (int i = 0; i < NUM_CORES; i++) {
@@ -113,8 +113,8 @@ public class SolrStartup {
       IOUtils.rm(tmpSolrHome);
     }
 
-    private static JettyConfig buildJettyConfig(String context) {
-      return JettyConfig.builder().setContext(context).stopAtShutdown(true).build();
+    private static JettyConfig buildJettyConfig() {
+      return JettyConfig.builder().stopAtShutdown(true).build();
     }
   }
 }
diff --git a/solr/benchmark/src/resources/solr.xml b/solr/benchmark/src/resources/solr.xml
index 439c8defdba..c7c6b44a362 100644
--- a/solr/benchmark/src/resources/solr.xml
+++ b/solr/benchmark/src/resources/solr.xml
@@ -38,13 +38,12 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:60000}</int> <!-- This should be high by default - dc's are expensive -->
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">${leaderVoteWait:15000}</int>   <!-- We are running tests - the default should be low, not like production -->
-    <int name="leaderConflictResolveWait">${leaderConflictResolveWait:45000}</int> 
+    <int name="leaderConflictResolveWait">${leaderConflictResolveWait:45000}</int>
     <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:5000}</int>
     <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:30000}</int> <!-- We are running tests - the default should be low, not like production -->
   </solrcloud>
-  
+
 </solr>
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index d8c3703957c..c812b7767cb 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -33,7 +33,6 @@ import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Array;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
-import java.net.URLEncoder;
 import java.net.UnknownHostException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -324,17 +323,10 @@ public class ZkController implements Closeable {
 
     this.genericCoreNodeNames = cloudConfig.getGenericCoreNodeNames();
 
-    // be forgiving and strip this off leading/trailing slashes
-    // this allows us to support users specifying hostContext="/" in
-    // solr.xml to indicate the root context, instead of hostContext=""
-    // which means the default of "solr"
-    String localHostContext = trimLeadingAndTrailingSlashes(cloudConfig.getSolrHostContext());
-
     this.zkServerAddress = zkServerAddress;
     this.localHostPort = cloudConfig.getSolrHostPort();
     this.hostName = normalizeHostName(cloudConfig.getHost());
-    this.nodeName =
-        generateNodeName(this.hostName, Integer.toString(this.localHostPort), localHostContext);
+    this.nodeName = generateNodeName(this.hostName, Integer.toString(this.localHostPort));
     MDCLoggingContext.setNode(nodeName);
     this.leaderVoteWait = cloudConfig.getLeaderVoteWait();
     this.leaderConflictResolveWait = cloudConfig.getLeaderConflictResolveWait();
@@ -2364,35 +2356,11 @@ public class ZkController implements Closeable {
    *
    * @param hostName - must not be null or the empty string
    * @param hostPort - must consist only of digits, must not be null or the empty string
-   * @param hostContext - should not begin or end with a slash (leading/trailin slashes will be
-   *     ignored), must not be null, may be the empty string to denote the root context
    * @lucene.experimental
    * @see ZkStateReader#getBaseUrlForNodeName
    */
-  static String generateNodeName(
-      final String hostName, final String hostPort, final String hostContext) {
-    return hostName
-        + ':'
-        + hostPort
-        + '_'
-        + URLEncoder.encode(trimLeadingAndTrailingSlashes(hostContext), StandardCharsets.UTF_8);
-  }
-
-  /**
-   * Utility method for trimming and leading and/or trailing slashes from its input. May return the
-   * empty string. May return null if and only if the input is null.
-   */
-  public static String trimLeadingAndTrailingSlashes(final String in) {
-    if (null == in) return in;
-
-    String out = in;
-    if (out.startsWith("/")) {
-      out = out.substring(1);
-    }
-    if (out.endsWith("/")) {
-      out = out.substring(0, out.length() - 1);
-    }
-    return out;
+  static String generateNodeName(final String hostName, final String hostPort) {
+    return hostName + ':' + hostPort + '_' + "solr";
   }
 
   public void rejoinOverseerElection(String electionNode, boolean joinAtHead) {
diff --git a/solr/core/src/java/org/apache/solr/core/CloudConfig.java b/solr/core/src/java/org/apache/solr/core/CloudConfig.java
index 4cb4026579b..5cc3e58e37e 100644
--- a/solr/core/src/java/org/apache/solr/core/CloudConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/CloudConfig.java
@@ -28,8 +28,6 @@ public class CloudConfig {
 
   private final String hostName;
 
-  private final String hostContext;
-
   private final boolean useGenericCoreNames;
 
   private final int leaderVoteWait;
@@ -63,7 +61,6 @@ public class CloudConfig {
       int zkClientTimeout,
       int hostPort,
       String hostName,
-      String hostContext,
       boolean useGenericCoreNames,
       int leaderVoteWait,
       int leaderConflictResolveWait,
@@ -82,7 +79,6 @@ public class CloudConfig {
     this.zkClientTimeout = zkClientTimeout;
     this.hostPort = hostPort;
     this.hostName = hostName;
-    this.hostContext = hostContext;
     this.useGenericCoreNames = useGenericCoreNames;
     this.leaderVoteWait = leaderVoteWait;
     this.leaderConflictResolveWait = leaderConflictResolveWait;
@@ -107,10 +103,6 @@ public class CloudConfig {
     if (this.hostPort == -1)
       throw new SolrException(
           SolrException.ErrorCode.SERVER_ERROR, "'hostPort' must be configured to run SolrCloud");
-    if (this.hostContext == null)
-      throw new SolrException(
-          SolrException.ErrorCode.SERVER_ERROR,
-          "'hostContext' must be configured to run SolrCloud");
   }
 
   public String getZkHost() {
@@ -125,10 +117,6 @@ public class CloudConfig {
     return hostPort;
   }
 
-  public String getSolrHostContext() {
-    return hostContext;
-  }
-
   public String getHost() {
     return hostName;
   }
@@ -203,7 +191,6 @@ public class CloudConfig {
     private int zkClientTimeout = Integer.getInteger("zkClientTimeout", DEFAULT_ZK_CLIENT_TIMEOUT);
     private final int hostPort;
     private final String hostName;
-    private final String hostContext;
     private boolean useGenericCoreNames;
     private int leaderVoteWait = DEFAULT_LEADER_VOTE_WAIT;
     private int leaderConflictResolveWait = DEFAULT_LEADER_CONFLICT_RESOLVE_WAIT;
@@ -222,13 +209,8 @@ public class CloudConfig {
     private String stateCompressorClass;
 
     public CloudConfigBuilder(String hostName, int hostPort) {
-      this(hostName, hostPort, null);
-    }
-
-    public CloudConfigBuilder(String hostName, int hostPort, String hostContext) {
       this.hostName = hostName;
       this.hostPort = hostPort;
-      this.hostContext = hostContext;
     }
 
     public CloudConfigBuilder setZkHost(String zkHost) {
@@ -323,7 +305,6 @@ public class CloudConfig {
           zkClientTimeout,
           hostPort,
           hostName,
-          hostContext,
           useGenericCoreNames,
           leaderVoteWait,
           leaderConflictResolveWait,
diff --git a/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java b/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
index 676026c82ed..32f36091101 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
@@ -411,13 +411,6 @@ public class SolrXmlConfig {
     return Arrays.asList(COMMA_SEPARATED_PATTERN.split(commaSeparatedString));
   }
 
-  private static Set<String> separateStringsToSet(String commaSeparatedString) {
-    if (StrUtils.isNullOrEmpty(commaSeparatedString)) {
-      return Collections.emptySet();
-    }
-    return Set.of(COMMA_SEPARATED_PATTERN.split(commaSeparatedString));
-  }
-
   private static Set<Path> separatePaths(String commaSeparatedString) {
     if (StrUtils.isNullOrEmpty(commaSeparatedString)) {
       return Collections.emptySet();
@@ -516,10 +509,15 @@ public class SolrXmlConfig {
       hostPort = parseInt("jetty.port", System.getProperty("jetty.port", "8983"));
     }
     String hostName = required("solrcloud", "host", removeValue(nl, "host"));
-    String hostContext = required("solrcloud", "hostContext", removeValue(nl, "hostContext"));
 
-    CloudConfig.CloudConfigBuilder builder =
-        new CloudConfig.CloudConfigBuilder(hostName, hostPort, hostContext);
+    // We no longer require or support the hostContext property, but legacy users may have it, so
+    // remove it from the list.
+    String hostContext = removeValue(nl, "hostContext");
+    if (hostContext != null) {
+      log.warn("solr.xml hostContext -- hostContext is deprecated and ignored.");
+    }
+
+    CloudConfig.CloudConfigBuilder builder = new CloudConfig.CloudConfigBuilder(hostName, hostPort);
     // set the defaultZkHost until/unless it's overridden in the "cloud section" (below)...
     builder.setZkHost(defaultZkHost);
 
diff --git a/solr/core/src/test-files/solr/solr-50-all.xml b/solr/core/src/test-files/solr/solr-50-all.xml
index 6849ed85d44..6803d2be0db 100644
--- a/solr/core/src/test-files/solr/solr-50-all.xml
+++ b/solr/core/src/test-files/solr/solr-50-all.xml
@@ -43,7 +43,6 @@
     <int name="maxUpdateConnectionsPerHost">37</int>
     <int name="leaderVoteWait">55</int>
     <str name="host">testHost</str>
-    <str name="hostContext">testHostContext</str>
     <int name="hostPort">${hostPort:44}</int>
     <int name="zkClientTimeout">77</int>
     <str name="zkHost">testZkHost</str>
diff --git a/solr/core/src/test-files/solr/solr-jmxreporter.xml b/solr/core/src/test-files/solr/solr-jmxreporter.xml
index 92ba4121b55..1a2a8365a27 100644
--- a/solr/core/src/test-files/solr/solr-jmxreporter.xml
+++ b/solr/core/src/test-files/solr/solr-jmxreporter.xml
@@ -26,7 +26,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">${leaderVoteWait:10000}</int>
diff --git a/solr/core/src/test-files/solr/solr-stress-new.xml b/solr/core/src/test-files/solr/solr-stress-new.xml
index 24b2719a118..434ef91067d 100644
--- a/solr/core/src/test-files/solr/solr-stress-new.xml
+++ b/solr/core/src/test-files/solr/solr-stress-new.xml
@@ -24,7 +24,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">8983</int>
-    <str name="hostContext">${hostContext:solr}</str>
   </solrcloud>
 
   <shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
diff --git a/solr/core/src/test-files/solr/solr-trackingshardhandler.xml b/solr/core/src/test-files/solr/solr-trackingshardhandler.xml
index 491d6460151..201177105ad 100644
--- a/solr/core/src/test-files/solr/solr-trackingshardhandler.xml
+++ b/solr/core/src/test-files/solr/solr-trackingshardhandler.xml
@@ -27,7 +27,6 @@
 
   <solrcloud>
     <str name="host">127.0.0.1</str>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="hostPort">${hostPort:8983}</int>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
diff --git a/solr/core/src/test-files/solr/solr.xml b/solr/core/src/test-files/solr/solr.xml
index 439c8defdba..c7c6b44a362 100644
--- a/solr/core/src/test-files/solr/solr.xml
+++ b/solr/core/src/test-files/solr/solr.xml
@@ -38,13 +38,12 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:60000}</int> <!-- This should be high by default - dc's are expensive -->
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">${leaderVoteWait:15000}</int>   <!-- We are running tests - the default should be low, not like production -->
-    <int name="leaderConflictResolveWait">${leaderConflictResolveWait:45000}</int> 
+    <int name="leaderConflictResolveWait">${leaderConflictResolveWait:45000}</int>
     <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:5000}</int>
     <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:30000}</int> <!-- We are running tests - the default should be low, not like production -->
   </solrcloud>
-  
+
 </solr>
diff --git a/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java b/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
index 9f77a41a92a..b55b368cb3f 100644
--- a/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
+++ b/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
@@ -75,7 +75,7 @@ public class TestSolrCoreProperties extends SolrJettyTestBase {
     }
     jetty =
         new JettySolrRunner(
-            homeDir.toAbsolutePath().toString(), nodeProperties, buildJettyConfig("/solr"));
+            homeDir.toAbsolutePath().toString(), nodeProperties, buildJettyConfig());
 
     jetty.start();
     port = jetty.getLocalPort();
diff --git a/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java b/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java
index 78afd0751dc..d6f7da99eee 100644
--- a/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java
+++ b/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java
@@ -123,7 +123,7 @@ public class TestSolrCLIRunExample extends SolrTestCaseJ4 {
                   Files.readAllBytes(Paths.get(solrHomeDir).resolve("solr.xml")),
                   Charset.defaultCharset());
 
-          JettyConfig jettyConfig = JettyConfig.builder().setContext("/solr").setPort(port).build();
+          JettyConfig jettyConfig = JettyConfig.builder().setPort(port).build();
           try {
             if (solrCloudCluster == null) {
               Path logDir = createTempDir("solr_logs");
@@ -230,7 +230,7 @@ public class TestSolrCLIRunExample extends SolrTestCaseJ4 {
       System.setProperty("jetty.port", String.valueOf(port));
       System.setProperty("solr.log.dir", createTempDir("solr_logs").toString());
 
-      standaloneSolr = new JettySolrRunner(solrHomeDir.getAbsolutePath(), "/solr", port);
+      standaloneSolr = new JettySolrRunner(solrHomeDir.getAbsolutePath(), port);
       Thread bg =
           new Thread() {
             @Override
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
index 17e0f02b68a..103efc7856c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
@@ -264,7 +264,7 @@ public class ChaosMonkeyShardSplitTest extends ShardSplitTest {
               "/admin/cores",
               reader,
               null,
-              new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983, "solr").build());
+              new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983).build());
       overseer.close();
       ElectionContext ec =
           new OverseerElectionContext(zkClient, overseer, address.replace("/", "_"));
diff --git a/solr/core/src/test/org/apache/solr/cloud/ClusterStateMockUtilTest.java b/solr/core/src/test/org/apache/solr/cloud/ClusterStateMockUtilTest.java
index 601e92e89b9..3b4cc30ab4d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ClusterStateMockUtilTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ClusterStateMockUtilTest.java
@@ -49,8 +49,8 @@ public class ClusterStateMockUtilTest extends SolrTestCaseJ4 {
       assertNotNull(replica1);
       assertEquals("baseUrl1:8983_", replica1.getNodeName());
       assertEquals("slice1_replica1", replica1.getCoreName());
-      assertEquals("http://baseUrl1:8983", replica1.getBaseUrl());
-      assertEquals("http://baseUrl1:8983/slice1_replica1/", replica1.getCoreUrl());
+      assertEquals("http://baseUrl1:8983/solr", replica1.getBaseUrl());
+      assertEquals("http://baseUrl1:8983/solr/slice1_replica1/", replica1.getCoreUrl());
       assertEquals(Replica.State.ACTIVE, replica1.getState());
       assertEquals(Replica.Type.NRT, replica1.getType());
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java b/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
index 3046181c193..7505c32a7bc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
@@ -44,7 +44,7 @@ public class ConcurrentCreateRoutedAliasTest extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(4, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(4, createTempDir(), buildJettyConfig());
   }
 
   @Override
diff --git a/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java b/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java
index 12affe3b0da..e372e355724 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java
@@ -51,7 +51,6 @@ public class CreateCollectionCleanupTest extends SolrCloudTestCase {
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
index 3fb714faa92..44e226afdf0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
@@ -258,8 +258,8 @@ public class LeaderElectionTest extends SolrTestCaseJ4 {
     Thread.sleep(1000);
 
     String urlScheme = zkStateReader.getClusterProperty(URL_SCHEME, "http");
-    String url1 = Utils.getBaseUrlForNodeName("127.0.0.1:80_solr/1", urlScheme) + "/";
-    String url2 = Utils.getBaseUrlForNodeName("127.0.0.1:80_solr/2", urlScheme) + "/";
+    String url1 = Utils.getBaseUrlForNodeName("127.0.0.1:80_solr", urlScheme) + "/1/";
+    String url2 = Utils.getBaseUrlForNodeName("127.0.0.1:80_solr", urlScheme) + "/2/";
 
     assertEquals("original leader was not registered", url1, getLeaderUrl("collection2", "slice1"));
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/NodeMutatorTest.java b/solr/core/src/test/org/apache/solr/cloud/NodeMutatorTest.java
index 0719f5beea6..965bab24c0f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/NodeMutatorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/NodeMutatorTest.java
@@ -31,13 +31,13 @@ import org.junit.Test;
 public class NodeMutatorTest extends SolrTestCaseJ4Test {
 
   private static final String NODE3 = "baseUrl3:8985_";
-  private static final String NODE3_URL = "http://baseUrl3:8985";
+  private static final String NODE3_URL = "http://baseUrl3:8985/solr";
 
   private static final String NODE2 = "baseUrl2:8984_";
-  private static final String NODE2_URL = "http://baseUrl2:8984";
+  private static final String NODE2_URL = "http://baseUrl2:8984/solr";
 
   private static final String NODE1 = "baseUrl1:8983_";
-  private static final String NODE1_URL = "http://baseUrl1:8983";
+  private static final String NODE1_URL = "http://baseUrl1:8983/solr";
 
   @Test
   public void downNodeReportsAllImpactedCollectionsAndNothingElse() {
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
index 146f7d722a5..1e7c8de5124 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -1025,7 +1025,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
               "/admin/cores",
               reader,
               zkController,
-              new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983, "")
+              new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983)
                   .setUseDistributedClusterStateUpdates(false)
                   .setUseDistributedCollectionConfigSetExecution(false)
                   .build());
@@ -1863,7 +1863,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
             "/admin/cores",
             reader,
             zkController,
-            new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983, "")
+            new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983)
                 .setUseDistributedClusterStateUpdates(false)
                 .build());
     overseers.add(overseer);
diff --git a/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java b/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
index fbc54b8831c..327561b14ff 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
@@ -69,7 +69,6 @@ public class SSLMigrationTest extends AbstractFullDistribZkTestBase {
       JettySolrRunner runner = jettys.get(i);
       JettyConfig config =
           JettyConfig.builder()
-              .setContext(context)
               .setPort(runner.getLocalPort())
               .stopAtShutdown(false)
               .withServlets(getExtraServlets())
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java b/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
index fec4dfab74b..868cd91e62a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
@@ -183,7 +183,6 @@ public class SolrXmlInZkTest extends SolrTestCaseJ4 {
           + "  <solrcloud>"
           + "    <str name=\"host\">127.0.0.1</str>"
           + "    <int name=\"hostPort\">9045</int>"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>"
           + "  </solrcloud>"
           + "  <shardHandlerFactory name=\"shardHandlerFactory\" class=\"HttpShardHandlerFactory\">"
           + "    <int name=\"socketTimeout\">${socketTimeout:120000}</int>"
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java
index 7e1e48bd568..2920e4ece52 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java
@@ -49,7 +49,7 @@ public class TestConfigSetsAPIExclusivity extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig());
   }
 
   @Override
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
index bbf0138a713..2ba85cfa437 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
@@ -86,7 +86,7 @@ public class TestConfigSetsAPIZkFailure extends SolrTestCaseJ4 {
             1,
             testDir,
             MiniSolrCloudCluster.DEFAULT_CLOUD_SOLR_XML,
-            buildJettyConfig("/solr"),
+            buildJettyConfig(),
             zkTestServer,
             true);
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
index 884978298cc..28b05444ca2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
@@ -52,7 +52,7 @@ public class TestLeaderElectionZkExpiry extends SolrTestCaseJ4 {
       server.run();
 
       CloudConfig cloudConfig =
-          new CloudConfig.CloudConfigBuilder("dummy.host.com", 8984, "solr")
+          new CloudConfig.CloudConfigBuilder("dummy.host.com", 8984)
               .setLeaderConflictResolveWait(180000)
               .setLeaderVoteWait(180000)
               .build();
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestRequestForwarding.java b/solr/core/src/test/org/apache/solr/cloud/TestRequestForwarding.java
index 7a719262fe1..06fca2452c7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestRequestForwarding.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestRequestForwarding.java
@@ -34,7 +34,7 @@ public class TestRequestForwarding extends SolrTestCaseJ4 {
     super.setUp();
     System.setProperty("solr.test.sys.prop1", "propone");
     System.setProperty("solr.test.sys.prop2", "proptwo");
-    solrCluster = new MiniSolrCloudCluster(3, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(3, createTempDir(), buildJettyConfig());
     solrCluster.uploadConfigSet(TEST_PATH().resolve("collection1/conf"), "conf1");
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java b/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java
index 0c40d8a9a88..1cb1c7692ba 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java
@@ -43,9 +43,9 @@ public class TestSSLRandomization extends SolrCloudTestCase {
   }
 
   public void testBaseUrl() {
-    String url = buildUrl(6666, "/foo");
+    String url = buildUrl(6666);
     assertEquals(
-        sslConfig.isSSLMode() ? "https://127.0.0.1:6666/foo" : "http://127.0.0.1:6666/foo", url);
+        sslConfig.isSSLMode() ? "https://127.0.0.1:6666/solr" : "http://127.0.0.1:6666/solr", url);
   }
 
   /** Used by {@link #testSSLRandomizer} */
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java b/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java
index 66296cb2440..caf3467cc89 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestWaitForStateWithJettyShutdowns.java
@@ -42,7 +42,7 @@ public class TestWaitForStateWithJettyShutdowns extends SolrTestCaseJ4 {
   public void testWaitForStateAfterShutDown() throws Exception {
     final String col_name = "test_col";
     final MiniSolrCloudCluster cluster =
-        new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig());
     try {
       log.info("Create our collection");
       CollectionAdminRequest.createCollection(col_name, "_default", 1, 1)
@@ -76,7 +76,7 @@ public class TestWaitForStateWithJettyShutdowns extends SolrTestCaseJ4 {
         ExecutorUtil.newMDCAwareFixedThreadPool(
             1, new SolrNamedThreadFactory("background_executor"));
     final MiniSolrCloudCluster cluster =
-        new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig());
     try {
       log.info("Create our collection");
       CollectionAdminRequest.createCollection(col_name, "_default", 1, 1)
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
index 0f0b4ef28cf..f1df3febab4 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
@@ -73,24 +73,11 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
   public void testNodeNameUrlConversion() throws Exception {
 
     // nodeName from parts
-    assertEquals("localhost:8888_solr", ZkController.generateNodeName("localhost", "8888", "solr"));
-    assertEquals(
-        "localhost:8888_solr", ZkController.generateNodeName("localhost", "8888", "/solr"));
-    assertEquals(
-        "localhost:8888_solr", ZkController.generateNodeName("localhost", "8888", "/solr/"));
+    assertEquals("localhost:8888_solr", ZkController.generateNodeName("localhost", "8888"));
     // root context
-    assertEquals("localhost:8888_", ZkController.generateNodeName("localhost", "8888", ""));
-    assertEquals("localhost:8888_", ZkController.generateNodeName("localhost", "8888", "/"));
+    assertEquals("localhost:8888_solr", ZkController.generateNodeName("localhost", "8888"));
     // subdir
-    assertEquals(
-        "foo-bar:77_solr%2Fsub_dir",
-        ZkController.generateNodeName("foo-bar", "77", "solr/sub_dir"));
-    assertEquals(
-        "foo-bar:77_solr%2Fsub_dir",
-        ZkController.generateNodeName("foo-bar", "77", "/solr/sub_dir"));
-    assertEquals(
-        "foo-bar:77_solr%2Fsub_dir",
-        ZkController.generateNodeName("foo-bar", "77", "/solr/sub_dir/"));
+    assertEquals("foo-bar:77_solr", ZkController.generateNodeName("foo-bar", "77"));
 
     // setup a SolrZkClient to do some getBaseUrlForNodeName testing
     Path zkDir = createTempDir("zkData");
@@ -110,56 +97,35 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
         try (ZkStateReader zkStateReader = new ZkStateReader(client)) {
           zkStateReader.createClusterStateWatchersAndUpdate();
 
-          // getBaseUrlForNodeName
-          assertEquals(
-              "http://zzz.xxx:1234/solr", zkStateReader.getBaseUrlForNodeName("zzz.xxx:1234_solr"));
           assertEquals(
               "http://zzz_xxx:1234/solr", zkStateReader.getBaseUrlForNodeName("zzz_xxx:1234_solr"));
-          assertEquals("http://xxx:99", zkStateReader.getBaseUrlForNodeName("xxx:99_"));
+
+          // test that no matter what you pass in, you end up with /solr.
+          assertEquals("http://xxx:99/solr", zkStateReader.getBaseUrlForNodeName("xxx:99_"));
+          // assertEquals("http://xxx:99/solr", result);
           assertEquals(
-              "http://foo-bar.baz.org:9999/some_dir",
+              "http://foo-bar.baz.org:9999/solr",
               zkStateReader.getBaseUrlForNodeName("foo-bar.baz.org:9999_some_dir"));
           assertEquals(
-              "http://foo-bar.baz.org:9999/solr/sub_dir",
+              "http://foo-bar.baz.org:9999/solr",
               zkStateReader.getBaseUrlForNodeName("foo-bar.baz.org:9999_solr%2Fsub_dir"));
 
           // generateNodeName + getBaseUrlForNodeName
           assertEquals(
               "http://foo:9876/solr",
-              zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo", "9876", "solr")));
-          assertEquals(
-              "http://foo:9876/solr",
-              zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo", "9876", "/solr")));
-          assertEquals(
-              "http://foo:9876/solr",
-              zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo", "9876", "/solr/")));
-          assertEquals(
-              "http://foo.bar.com:9876/solr/sub_dir",
-              zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo.bar.com", "9876", "solr/sub_dir")));
-          assertEquals(
-              "http://foo.bar.com:9876/solr/sub_dir",
-              zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo.bar.com", "9876", "/solr/sub_dir/")));
-          assertEquals(
-              "http://foo-bar:9876",
-              zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo-bar", "9876", "")));
+              zkStateReader.getBaseUrlForNodeName(ZkController.generateNodeName("foo", "9876")));
           assertEquals(
-              "http://foo-bar:9876",
+              "http://foo.bar.com:9876/solr",
               zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo-bar", "9876", "/")));
+                  ZkController.generateNodeName("foo.bar.com", "9876")));
           assertEquals(
-              "http://foo-bar.com:80/some_dir",
+              "http://foo-bar:9876/solr",
               zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo-bar.com", "80", "some_dir")));
+                  ZkController.generateNodeName("foo-bar", "9876")));
           assertEquals(
-              "http://foo-bar.com:80/some_dir",
+              "http://foo-bar.com:80/solr",
               zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo-bar.com", "80", "/some_dir")));
+                  ZkController.generateNodeName("foo-bar.com", "80")));
         }
 
         ClusterProperties cp = new ClusterProperties(client);
@@ -176,9 +142,9 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
               zkStateReader.getBaseUrlForNodeName("zzz.xxx:1234_solr"));
 
           assertEquals(
-              "https://foo-bar.com:80/some_dir",
+              "https://foo-bar.com:80/solr",
               zkStateReader.getBaseUrlForNodeName(
-                  ZkController.generateNodeName("foo-bar.com", "80", "/some_dir")));
+                  ZkController.generateNodeName("foo-bar.com", "80")));
         }
       }
     } finally {
@@ -197,8 +163,7 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
       ZkController zkController = null;
 
       try {
-        CloudConfig cloudConfig =
-            new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983, "solr").build();
+        CloudConfig cloudConfig = new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983).build();
         zkController =
             new ZkController(cc, server.getZkAddress(), TIMEOUT, cloudConfig, () -> null);
       } catch (IllegalArgumentException e) {
@@ -258,8 +223,7 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
       ZkController zkController = null;
 
       try {
-        CloudConfig cloudConfig =
-            new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983, "solr").build();
+        CloudConfig cloudConfig = new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983).build();
         zkController =
             new ZkController(cc, server.getZkAddress(), TIMEOUT, cloudConfig, () -> null);
         zkControllerRef.set(zkController);
@@ -365,8 +329,7 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
               .build()) {
         CoreContainer cc = getCoreContainer();
         try {
-          CloudConfig cloudConfig =
-              new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983, "solr").build();
+          CloudConfig cloudConfig = new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983).build();
           try (ZkController zkController =
               new ZkController(cc, server.getZkAddress(), TIMEOUT, cloudConfig, () -> null)) {
             final Path dir = createTempDir();
@@ -447,8 +410,7 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
                         cc,
                         server.getZkAddress(),
                         TIMEOUT,
-                        new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983 + index, "solr")
-                            .build(),
+                        new CloudConfig.CloudConfigBuilder("127.0.0.1", 8983 + index).build(),
                         () -> null);
               } catch (Exception e) {
                 exception.compareAndSet(null, e);
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/ConcurrentDeleteAndCreateCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/ConcurrentDeleteAndCreateCollectionTest.java
index 51678f06d5f..98937a4395b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/ConcurrentDeleteAndCreateCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/ConcurrentDeleteAndCreateCollectionTest.java
@@ -46,7 +46,7 @@ public class ConcurrentDeleteAndCreateCollectionTest extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig());
   }
 
   @Override
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
index 1c1f3536b76..c6e52ffeab6 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/LocalFSCloudIncrementalBackupTest.java
@@ -40,7 +40,6 @@ public class LocalFSCloudIncrementalBackupTest extends AbstractIncrementalBackup
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java b/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
index a7b2a65918d..44cd51b6c41 100644
--- a/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
+++ b/solr/core/src/test/org/apache/solr/core/TestCoreDiscovery.java
@@ -630,7 +630,6 @@ public class TestCoreDiscovery extends SolrTestCaseJ4 {
           + Paths.get(TEST_HOME()).resolve("configsets")
           + "</str>"
           + "<solrcloud> "
-          + "<str name=\"hostContext\">solrprop</str> "
           + "<int name=\"zkClientTimeout\">20</int> "
           + "<str name=\"host\">222.333.444.555</str> "
           + "<int name=\"hostPort\">6000</int>  "
diff --git a/solr/core/src/test/org/apache/solr/core/TestSolrXml.java b/solr/core/src/test/org/apache/solr/core/TestSolrXml.java
index 9cdc5b1a253..46e6c6ba9b9 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrXml.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrXml.java
@@ -97,7 +97,6 @@ public class TestSolrXml extends SolrTestCaseJ4 {
     assertEquals("max update conn", 3, ucfg.getMaxUpdateConnections());
     assertEquals("max update conn/host", 37, ucfg.getMaxUpdateConnectionsPerHost());
     assertEquals("host", "testHost", ccfg.getHost());
-    assertEquals("zk host context", "testHostContext", ccfg.getSolrHostContext());
     assertEquals("solr host port", 44, ccfg.getSolrHostPort());
     assertEquals("leader vote wait", 55, ccfg.getLeaderVoteWait());
     assertEquals("logging class", "testLoggingClass", cfg.getLogWatcherConfig().getLoggingClass());
@@ -160,7 +159,6 @@ public class TestSolrXml extends SolrTestCaseJ4 {
             + "<solrcloud>"
             + "<str name=\"host\">host</str>"
             + "<int name=\"hostPort\">0</int>"
-            + "<str name=\"hostContext\">solr</str>"
             + "<null name=\"leaderVoteWait\"/>"
             + "</solrcloud></solr>";
 
@@ -317,7 +315,7 @@ public class TestSolrXml extends SolrTestCaseJ4 {
 
   public void testFailAtConfigParseTimeWhenUnrecognizedSolrCloudOptionWasFound() {
     String solrXml =
-        "<solr><solrcloud><str name=\"host\">host</str><int name=\"hostPort\">8983</int><str name=\"hostContext\"></str><bool name=\"unknown-option\">true</bool></solrcloud></solr>";
+        "<solr><solrcloud><str name=\"host\">host</str><int name=\"hostPort\">8983</int><bool name=\"unknown-option\">true</bool></solrcloud></solr>";
 
     SolrException thrown =
         assertThrows(SolrException.class, () -> SolrXmlConfig.fromString(solrHome, solrXml));
@@ -448,12 +446,10 @@ public class TestSolrXml extends SolrTestCaseJ4 {
     assertEquals("solrcloud section missing required entry 'host'", thrown.getMessage());
   }
 
-  public void testCloudConfigRequiresHostContext() {
+  public void testCloudConfigContinuesToWorkIfHostContextDefined() {
     String solrXml =
-        "<solr><solrcloud><str name=\"host\">host</str><int name=\"hostPort\">8983</int></solrcloud></solr>";
-    SolrException thrown =
-        assertThrows(SolrException.class, () -> SolrXmlConfig.fromString(solrHome, solrXml));
-    assertEquals("solrcloud section missing required entry 'hostContext'", thrown.getMessage());
+        "<solr><solrcloud><str name=\"host\">host</str><str name=\"hostContext\">legacyHostContent</str><int name=\"hostPort\">8983</int></solrcloud></solr>";
+    SolrXmlConfig.fromString(solrHome, solrXml);
   }
 
   public void testMultiBackupSectionError() {
diff --git a/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
index 859a07e3e15..fc6e8fd19a2 100644
--- a/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/PingRequestHandlerTest.java
@@ -169,7 +169,7 @@ public class PingRequestHandlerTest extends SolrTestCaseJ4 {
   public void testPingInClusterWithNoHealthCheck() throws Exception {
 
     MiniSolrCloudCluster miniCluster =
-        new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), buildJettyConfig());
 
     final CloudSolrClient cloudSolrClient = miniCluster.getSolrClient();
 
diff --git a/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java b/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java
index 83b60838b06..bb6a06c16cd 100644
--- a/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java
+++ b/solr/core/src/test/org/apache/solr/handler/ReplicationTestHelper.java
@@ -58,7 +58,7 @@ public final class ReplicationTestHelper {
         new File(instance.getHomeDir(), "solr.xml"));
     Properties nodeProperties = new Properties();
     nodeProperties.setProperty("solr.data.dir", instance.getDataDir());
-    JettyConfig jettyConfig = JettyConfig.builder().setContext("/solr").setPort(0).build();
+    JettyConfig jettyConfig = JettyConfig.builder().setPort(0).build();
     JettySolrRunner jetty = new JettySolrRunner(instance.getHomeDir(), nodeProperties, jettyConfig);
     jetty.start();
     return jetty;
diff --git a/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java b/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java
index 1d3ecfeed62..c5a4ba0be25 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java
@@ -46,8 +46,6 @@ public class TestHealthCheckHandlerLegacyMode extends SolrTestCaseJ4 {
   SolrClient leaderClient, followerClient;
   ReplicationTestHelper.SolrInstance leader = null, follower = null;
 
-  private static final String context = "/solr";
-
   @Override
   @Before
   public void setUp() throws Exception {
@@ -62,9 +60,9 @@ public class TestHealthCheckHandlerLegacyMode extends SolrTestCaseJ4 {
     leaderJetty = ReplicationTestHelper.createAndStartJetty(leader);
     leaderClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(leaderJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(leaderJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
     leaderClientHealthCheck =
-        ReplicationTestHelper.createNewSolrClient(buildUrl(leaderJetty.getLocalPort(), context));
+        ReplicationTestHelper.createNewSolrClient(buildUrl(leaderJetty.getLocalPort()));
 
     follower =
         new SolrInstance(
@@ -73,9 +71,9 @@ public class TestHealthCheckHandlerLegacyMode extends SolrTestCaseJ4 {
     followerJetty = createAndStartJetty(follower);
     followerClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(followerJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(followerJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
     followerClientHealthCheck =
-        ReplicationTestHelper.createNewSolrClient(buildUrl(followerJetty.getLocalPort(), context));
+        ReplicationTestHelper.createNewSolrClient(buildUrl(followerJetty.getLocalPort()));
 
     System.setProperty("solr.indexfetcher.sotimeout2", "45000");
   }
@@ -130,8 +128,7 @@ public class TestHealthCheckHandlerLegacyMode extends SolrTestCaseJ4 {
 
     // stop replication so that the follower doesn't pull the index
     invokeReplicationCommand(
-        buildUrl(followerJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME,
-        "disablepoll");
+        buildUrl(followerJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME, "disablepoll");
 
     // create multiple commits
     int docsAdded = 0;
@@ -236,8 +233,8 @@ public class TestHealthCheckHandlerLegacyMode extends SolrTestCaseJ4 {
 
   public static void pullFromTo(JettySolrRunner srcSolr, JettySolrRunner destSolr)
       throws IOException {
-    String srcUrl = buildUrl(srcSolr.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME;
-    String destUrl = buildUrl(destSolr.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME;
+    String srcUrl = buildUrl(srcSolr.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME;
+    String destUrl = buildUrl(destSolr.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME;
     ReplicationTestHelper.pullFromTo(srcUrl, destUrl);
   }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
index f01fad15f6e..8fc56376c2a 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
@@ -98,8 +98,6 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
   SolrClient leaderClient, followerClient, repeaterClient;
   SolrInstance leader = null, follower = null, repeater = null;
 
-  static String context = "/solr";
-
   // number of docs to index... decremented for each test case to tell if we accidentally reuse
   // index from previous test method
   static int nDocs = 500;
@@ -125,7 +123,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     leaderJetty = createAndStartJetty(leader);
     leaderClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(leaderJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(leaderJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
 
     follower =
         new SolrInstance(
@@ -134,7 +132,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     followerJetty = createAndStartJetty(follower);
     followerClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(followerJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(followerJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
 
     System.setProperty("solr.indexfetcher.sotimeout2", "45000");
   }
@@ -302,10 +300,10 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     leaderClient.close();
     leaderClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(leaderJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(leaderJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
     followerClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(followerJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(followerJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
 
     clearIndexWithReplication();
     {
@@ -375,7 +373,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
       repeaterJetty = createAndStartJetty(repeater);
       repeaterClient =
           ReplicationTestHelper.createNewSolrClient(
-              buildUrl(repeaterJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+              buildUrl(repeaterJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
 
       NamedList<Object> details = getDetails(repeaterClient);
 
@@ -409,7 +407,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
       instanceJetty = createAndStartJetty(solrInstance);
       client =
           ReplicationTestHelper.createNewSolrClient(
-              buildUrl(instanceJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+              buildUrl(instanceJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
 
       NamedList<Object> details = getDetails(client);
 
@@ -812,7 +810,7 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     followerClient.close();
     followerClient =
         ReplicationTestHelper.createNewSolrClient(
-            buildUrl(followerJetty.getLocalPort(), context) + "/" + DEFAULT_TEST_CORENAME);
+            buildUrl(followerJetty.getLocalPort()) + "/" + DEFAULT_TEST_CORENAME);
 
     leaderClient.deleteByQuery("*:*");
     followerClient.deleteByQuery("*:*");
@@ -1815,8 +1813,4 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
     assertNotNull("Expected replication response to have 'status' field", response.get("status"));
     assertEquals("OK", response.get("status"));
   }
-
-  public static String buildUrl(int port) {
-    return buildUrl(port, context);
-  }
 }
diff --git a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java
index aff53aa66e3..a85416727e6 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandlerBackup.java
@@ -64,8 +64,6 @@ public class TestReplicationHandlerBackup extends SolrJettyTestBase {
   private static final String CONF_DIR =
       "solr" + File.separator + "collection1" + File.separator + "conf" + File.separator;
 
-  private static String context = "/solr";
-
   boolean addNumberToKeepInRequest = true;
   String backupKeepParamName = ReplicationHandler.NUMBER_BACKUPS_TO_KEEP_REQUEST_PARAM;
   private static long docsSeed; // see indexDocs()
@@ -78,14 +76,14 @@ public class TestReplicationHandlerBackup extends SolrJettyTestBase {
         new File(instance.getHomeDir(), "solr.xml"));
     Properties nodeProperties = new Properties();
     nodeProperties.setProperty("solr.data.dir", instance.getDataDir());
-    JettyConfig jettyConfig = JettyConfig.builder().setContext("/solr").setPort(0).build();
+    JettyConfig jettyConfig = JettyConfig.builder().setPort(0).build();
     JettySolrRunner jetty = new JettySolrRunner(instance.getHomeDir(), nodeProperties, jettyConfig);
     jetty.start();
     return jetty;
   }
 
   private static SolrClient createNewSolrClient(int port) {
-    final String baseUrl = buildUrl(port, context);
+    final String baseUrl = buildUrl(port);
     return new HttpSolrClient.Builder(baseUrl)
         .withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
         .withSocketTimeout(60000, TimeUnit.MILLISECONDS)
@@ -255,7 +253,7 @@ public class TestReplicationHandlerBackup extends SolrJettyTestBase {
   public static void runBackupCommand(JettySolrRunner leaderJetty, String cmd, String params)
       throws IOException {
     String leaderUrl =
-        buildUrl(leaderJetty.getLocalPort(), context)
+        buildUrl(leaderJetty.getLocalPort())
             + "/"
             + DEFAULT_TEST_CORENAME
             + ReplicationHandler.PATH
diff --git a/solr/core/src/test/org/apache/solr/handler/TestRestoreCore.java b/solr/core/src/test/org/apache/solr/handler/TestRestoreCore.java
index 553bf5912d3..b46bbfb6ff6 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestRestoreCore.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestRestoreCore.java
@@ -52,7 +52,6 @@ public class TestRestoreCore extends SolrJettyTestBase {
   private static final String CONF_DIR =
       "solr" + File.separator + DEFAULT_TEST_CORENAME + File.separator + "conf" + File.separator;
 
-  private static String context = "/solr";
   private static long docsSeed; // see indexDocs()
 
   private static JettySolrRunner createAndStartJetty(ReplicationTestHelper.SolrInstance instance)
@@ -62,7 +61,7 @@ public class TestRestoreCore extends SolrJettyTestBase {
         new File(instance.getHomeDir(), "solr.xml"));
     Properties nodeProperties = new Properties();
     nodeProperties.setProperty("solr.data.dir", instance.getDataDir());
-    JettyConfig jettyConfig = JettyConfig.builder().setContext("/solr").setPort(0).build();
+    JettyConfig jettyConfig = JettyConfig.builder().setPort(0).build();
     JettySolrRunner jetty = new JettySolrRunner(instance.getHomeDir(), nodeProperties, jettyConfig);
     jetty.start();
     return jetty;
@@ -70,7 +69,7 @@ public class TestRestoreCore extends SolrJettyTestBase {
 
   private static SolrClient createNewSolrClient(int port) {
 
-    final String baseUrl = buildUrl(port, context);
+    final String baseUrl = buildUrl(port);
     return new HttpSolrClient.Builder(baseUrl)
         .withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
         .withSocketTimeout(60000, TimeUnit.MILLISECONDS)
diff --git a/solr/core/src/test/org/apache/solr/handler/V2StandaloneTest.java b/solr/core/src/test/org/apache/solr/handler/V2StandaloneTest.java
index a5672d42b3d..3ba2be501b3 100644
--- a/solr/core/src/test/org/apache/solr/handler/V2StandaloneTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/V2StandaloneTest.java
@@ -37,10 +37,10 @@ public class V2StandaloneTest extends SolrTestCaseJ4 {
     Files.copy(Path.of(TEST_HOME(), "solr.xml"), solrHomeTmp.resolve("solr.xml"));
 
     JettySolrRunner jetty =
-        new JettySolrRunner(solrHomeTmp.toAbsolutePath().toString(), buildJettyConfig("/solr"));
+        new JettySolrRunner(solrHomeTmp.toAbsolutePath().toString(), buildJettyConfig());
     jetty.start();
 
-    try (SolrClient client = getHttpSolrClient(buildUrl(jetty.getLocalPort(), "/solr/"))) {
+    try (SolrClient client = getHttpSolrClient(buildUrl(jetty.getLocalPort()))) {
       NamedList<?> res = client.request(new V2Request.Builder("/").build());
       NamedList<?> header = (NamedList<?>) res.get("responseHeader");
       assertEquals(0, header.get("status"));
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
index 0ab68fc397e..f1a76a8efe6 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminHandlerTest.java
@@ -301,8 +301,7 @@ public class CoreAdminHandlerTest extends SolrTestCaseJ4 {
     Files.writeString(renamePropFile, "", StandardCharsets.UTF_8);
 
     JettySolrRunner runner =
-        new JettySolrRunner(
-            solrHomeDirectory.toAbsolutePath().toString(), buildJettyConfig("/solr"));
+        new JettySolrRunner(solrHomeDirectory.toAbsolutePath().toString(), buildJettyConfig());
     runner.start();
 
     try (SolrClient client =
@@ -374,8 +373,7 @@ public class CoreAdminHandlerTest extends SolrTestCaseJ4 {
     Path corex = solrHomeDirectory.resolve("corex");
     Files.writeString(corex.resolve("core.properties"), "", StandardCharsets.UTF_8);
     JettySolrRunner runner =
-        new JettySolrRunner(
-            solrHomeDirectory.toAbsolutePath().toString(), buildJettyConfig("/solr"));
+        new JettySolrRunner(solrHomeDirectory.toAbsolutePath().toString(), buildJettyConfig());
     runner.start();
 
     try (SolrClient client =
@@ -436,8 +434,7 @@ public class CoreAdminHandlerTest extends SolrTestCaseJ4 {
     Path corex = solrHomeDirectory.resolve("corex");
     Files.writeString(corex.resolve("core.properties"), "", StandardCharsets.UTF_8);
     JettySolrRunner runner =
-        new JettySolrRunner(
-            solrHomeDirectory.toAbsolutePath().toString(), buildJettyConfig("/solr"));
+        new JettySolrRunner(solrHomeDirectory.toAbsolutePath().toString(), buildJettyConfig());
     runner.start();
 
     try (SolrClient client =
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java b/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java
index e5d2d09b663..e0ab41ac9ab 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/DaemonStreamApiTest.java
@@ -65,7 +65,7 @@ public class DaemonStreamApiTest extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    cluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+    cluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig());
 
     url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString() + "/" + CHECKPOINT_COLL;
 
diff --git a/solr/core/src/test/org/apache/solr/handler/component/CloudReplicaSourceTest.java b/solr/core/src/test/org/apache/solr/handler/component/CloudReplicaSourceTest.java
index f52aefbb42c..5af92386712 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/CloudReplicaSourceTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/CloudReplicaSourceTest.java
@@ -58,10 +58,12 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
       assertEquals(2, cloudReplicaSource.getSliceNames().size());
       assertEquals(1, cloudReplicaSource.getReplicasBySlice(0).size());
       assertEquals(
-          "http://baseUrl1:8983/slice1_replica1/", cloudReplicaSource.getReplicasBySlice(0).get(0));
+          "http://baseUrl1:8983/solr/slice1_replica1/",
+          cloudReplicaSource.getReplicasBySlice(0).get(0));
       assertEquals(1, cloudReplicaSource.getReplicasBySlice(1).size());
       assertEquals(
-          "http://baseUrl2:8984/slice2_replica2/", cloudReplicaSource.getReplicasBySlice(1).get(0));
+          "http://baseUrl2:8984/solr/slice2_replica2/",
+          cloudReplicaSource.getReplicasBySlice(1).get(0));
     }
   }
 
@@ -87,7 +89,8 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
       assertEquals(2, cloudReplicaSource.getSliceNames().size());
       assertEquals(1, cloudReplicaSource.getReplicasBySlice(0).size());
       assertEquals(
-          "http://baseUrl1:8983/slice1_replica1/", cloudReplicaSource.getReplicasBySlice(0).get(0));
+          "http://baseUrl1:8983/solr/slice1_replica1/",
+          cloudReplicaSource.getReplicasBySlice(0).get(0));
       assertEquals(0, cloudReplicaSource.getReplicasBySlice(1).size());
     }
   }
@@ -115,11 +118,13 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
       assertEquals(2, cloudReplicaSource.getSliceNames().size());
       assertEquals(1, cloudReplicaSource.getReplicasBySlice(0).size());
       assertEquals(
-          "http://baseUrl1:8983/slice1_replica1/", cloudReplicaSource.getReplicasBySlice(0).get(0));
+          "http://baseUrl1:8983/solr/slice1_replica1/",
+          cloudReplicaSource.getReplicasBySlice(0).get(0));
       assertEquals(1, cloudReplicaSource.getReplicasBySlice(1).size());
       assertEquals(1, cloudReplicaSource.getReplicasBySlice(1).size());
       assertEquals(
-          "http://baseUrl2:8984/slice2_replica2/", cloudReplicaSource.getReplicasBySlice(1).get(0));
+          "http://baseUrl2:8984/solr/slice2_replica2/",
+          cloudReplicaSource.getReplicasBySlice(1).get(0));
     }
   }
 
@@ -153,17 +158,17 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
         switch (sliceName) {
           case "collection1_slice1":
             assertEquals(
-                "http://baseUrl1:8983/slice1_replica1/",
+                "http://baseUrl1:8983/solr/slice1_replica1/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
           case "collection1_slice2":
             assertEquals(
-                "http://baseUrl2:8984/slice2_replica2/",
+                "http://baseUrl2:8984/solr/slice2_replica2/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
           case "collection2_slice1":
             assertEquals(
-                "http://baseUrl1:8983/slice1_replica3/",
+                "http://baseUrl1:8983/solr/slice1_replica3/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
         }
@@ -198,12 +203,12 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
         switch (sliceName) {
           case "slice1":
             assertEquals(
-                "http://baseUrl1:8983/slice1_replica1/",
+                "http://baseUrl1:8983/solr/slice1_replica1/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
           case "slice2":
             assertEquals(
-                "http://baseUrl2:8984/slice2_replica2/",
+                "http://baseUrl2:8984/solr/slice2_replica2/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
         }
@@ -239,13 +244,13 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
           case "slice1":
             assertEquals(2, cloudReplicaSource.getReplicasBySlice(i).size());
             assertEquals(
-                "http://baseUrl1:8983/slice1_replica1/",
+                "http://baseUrl1:8983/solr/slice1_replica1/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
           case "slice2":
             assertEquals(1, cloudReplicaSource.getReplicasBySlice(i).size());
             assertEquals(
-                "http://baseUrl2:8984/slice2_replica3/",
+                "http://baseUrl2:8984/solr/slice2_replica3/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
         }
@@ -284,19 +289,19 @@ public class CloudReplicaSourceTest extends SolrTestCaseJ4 {
           case "collection1_slice1":
             assertEquals(2, cloudReplicaSource.getReplicasBySlice(i).size());
             assertEquals(
-                "http://baseUrl1:8983/slice1_replica1/",
+                "http://baseUrl1:8983/solr/slice1_replica1/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
           case "collection1_slice2":
             assertEquals(1, cloudReplicaSource.getReplicasBySlice(i).size());
             assertEquals(
-                "http://baseUrl2:8984/slice2_replica3/",
+                "http://baseUrl2:8984/solr/slice2_replica3/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
           case "collection2_slice1":
             assertEquals(1, cloudReplicaSource.getReplicasBySlice(i).size());
             assertEquals(
-                "http://baseUrl1:8983/slice1_replica5/",
+                "http://baseUrl1:8983/solr/slice1_replica5/",
                 cloudReplicaSource.getReplicasBySlice(i).get(0));
             break;
         }
diff --git a/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
index 0f22a624093..752e4e21c57 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/SearchHandlerTest.java
@@ -125,7 +125,7 @@ public class SearchHandlerTest extends SolrTestCaseJ4 {
   @Test
   public void testZkConnected() throws Exception {
     MiniSolrCloudCluster miniCluster =
-        new MiniSolrCloudCluster(5, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(5, createTempDir(), buildJettyConfig());
 
     final CloudSolrClient cloudSolrClient = miniCluster.getSolrClient();
 
@@ -170,7 +170,7 @@ public class SearchHandlerTest extends SolrTestCaseJ4 {
   @Test
   public void testRequireZkConnected() throws Exception {
     MiniSolrCloudCluster miniCluster =
-        new MiniSolrCloudCluster(5, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(5, createTempDir(), buildJettyConfig());
 
     final CloudSolrClient cloudSolrClient = miniCluster.getSolrClient();
 
@@ -222,7 +222,7 @@ public class SearchHandlerTest extends SolrTestCaseJ4 {
   @Test
   public void testRequireZkConnectedDistrib() throws Exception {
     MiniSolrCloudCluster miniCluster =
-        new MiniSolrCloudCluster(2, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(2, createTempDir(), buildJettyConfig());
 
     final CloudSolrClient cloudSolrClient = miniCluster.getSolrClient();
 
diff --git a/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java b/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java
index 329cef1b13b..393674c2eca 100644
--- a/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java
+++ b/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java
@@ -93,7 +93,7 @@ public class TestRawTransformer extends SolrCloudTestCase {
     nodeProperties.setProperty("solr.data.dir", h.getCore().getDataDir());
     JSR =
         new JettySolrRunner(
-            homeDir.toAbsolutePath().toString(), nodeProperties, buildJettyConfig("/solr"));
+            homeDir.toAbsolutePath().toString(), nodeProperties, buildJettyConfig());
   }
 
   private static void initCloud() throws Exception {
diff --git a/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java b/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
index a8bb1ecb69c..caaa8e2386d 100644
--- a/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
+++ b/solr/core/src/test/org/apache/solr/search/stats/TestDistribIDF.java
@@ -52,7 +52,7 @@ public class TestDistribIDF extends SolrTestCaseJ4 {
     }
 
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(3, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(3, createTempDir(), buildJettyConfig());
     // set some system properties for use by tests
     System.setProperty("solr.test.sys.prop1", "propone");
     System.setProperty("solr.test.sys.prop2", "proptwo");
diff --git a/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java b/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java
index dad37ef47b8..9bf2787afce 100644
--- a/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java
+++ b/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java
@@ -92,7 +92,7 @@ public class BasicAuthStandaloneTest extends SolrTestCaseJ4 {
     SolrClient solrClient = null;
     try {
       httpClient = HttpClientUtil.createClient(null);
-      String baseUrl = buildUrl(jetty.getLocalPort(), "/solr");
+      String baseUrl = buildUrl(jetty.getLocalPort());
       solrClient = getHttpSolrClient(baseUrl);
 
       verifySecurityStatus(httpClient, baseUrl + authcPrefix, "/errorMessages", null, 20);
@@ -201,8 +201,7 @@ public class BasicAuthStandaloneTest extends SolrTestCaseJ4 {
     Properties nodeProperties = new Properties();
     nodeProperties.setProperty("solr.data.dir", instance.getDataDir().toString());
     JettySolrRunner jetty =
-        new JettySolrRunner(
-            instance.getHomeDir().toString(), nodeProperties, buildJettyConfig("/solr"));
+        new JettySolrRunner(instance.getHomeDir().toString(), nodeProperties, buildJettyConfig());
     jetty.start();
     return jetty;
   }
diff --git a/solr/core/src/test/org/apache/solr/security/MultiAuthPluginTest.java b/solr/core/src/test/org/apache/solr/security/MultiAuthPluginTest.java
index 1f3bd062121..ec6dcd65c41 100644
--- a/solr/core/src/test/org/apache/solr/security/MultiAuthPluginTest.java
+++ b/solr/core/src/test/org/apache/solr/security/MultiAuthPluginTest.java
@@ -91,7 +91,7 @@ public class MultiAuthPluginTest extends SolrTestCaseJ4 {
     SolrClient solrClient = null;
     try {
       httpClient = HttpClientUtil.createClient(null);
-      String baseUrl = buildUrl(jetty.getLocalPort(), "/solr");
+      String baseUrl = buildUrl(jetty.getLocalPort());
       solrClient = getHttpSolrClient(baseUrl);
 
       verifySecurityStatus(httpClient, baseUrl + authcPrefix, "/errorMessages", null, 5);
diff --git a/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java b/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
index 9f6cafa9d2c..57866f8a716 100644
--- a/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
@@ -842,7 +842,7 @@ public class SolrCmdDistributorTest extends BaseDistributedSearchTestCase {
 
       ZkNodeProps nodeProps =
           new ZkNodeProps(
-              ZkStateReader.BASE_URL_PROP, DEAD_HOST_1 + context, ZkStateReader.CORE_NAME_PROP, "");
+              ZkStateReader.BASE_URL_PROP, DEAD_HOST_1 + "/solr", ZkStateReader.CORE_NAME_PROP, "");
       ForwardNode retryNode =
           new ForwardNode(new ZkCoreNodeProps(nodeProps), null, "collection1", "shard1", 5) {
             @Override
diff --git a/solr/modules/gcs-repository/src/test/org/apache/solr/gcs/GCSIncrementalBackupTest.java b/solr/modules/gcs-repository/src/test/org/apache/solr/gcs/GCSIncrementalBackupTest.java
index ac0b15a0187..83b93b2ce58 100644
--- a/solr/modules/gcs-repository/src/test/org/apache/solr/gcs/GCSIncrementalBackupTest.java
+++ b/solr/modules/gcs-repository/src/test/org/apache/solr/gcs/GCSIncrementalBackupTest.java
@@ -48,7 +48,6 @@ public class GCSIncrementalBackupTest extends AbstractIncrementalBackupTest {
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java
index 7d3fce1ef23..859857eed1b 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java
@@ -67,7 +67,7 @@ public class TestSolrCloudWithDelegationTokens extends SolrTestCaseJ4 {
     System.setProperty(KerberosPlugin.DELEGATION_TOKEN_ENABLED, "true");
     System.setProperty("solr.kerberos.cookie.domain", "127.0.0.1");
 
-    miniCluster = new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), buildJettyConfig("/solr"));
+    miniCluster = new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), buildJettyConfig());
     JettySolrRunner runnerPrimary = miniCluster.getJettySolrRunners().get(0);
     solrClientPrimary = new HttpSolrClient.Builder(runnerPrimary.getBaseUrl().toString()).build();
     JettySolrRunner runnerSecondary = miniCluster.getJettySolrRunners().get(1);
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java
index 2975410a442..0a098d0387d 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java
@@ -112,7 +112,7 @@ public class TestSolrCloudWithSecureImpersonation extends SolrTestCaseJ4 {
     SolrRequestParsers.DEFAULT.setAddRequestHeadersToContext(true);
     System.setProperty("collectionsHandler", ImpersonatorCollectionsHandler.class.getName());
 
-    miniCluster = new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), buildJettyConfig("/solr"));
+    miniCluster = new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), buildJettyConfig());
     JettySolrRunner runner = miniCluster.getJettySolrRunners().get(0);
     solrClient = new HttpSolrClient.Builder(runner.getBaseUrl().toString()).build();
   }
diff --git a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java
index d79aadb1811..ec65c0ed96c 100644
--- a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java
+++ b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java
@@ -47,7 +47,6 @@ import org.apache.lucene.store.LockFactory;
 import org.apache.lucene.store.NRTCachingDirectory;
 import org.apache.lucene.store.NoLockFactory;
 import org.apache.lucene.store.SingleInstanceLockFactory;
-import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cloud.api.collections.SplitShardCmd;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
@@ -476,11 +475,7 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory
 
     return normalize(
         SolrPaths.normalizeDir(
-            ZkController.trimLeadingAndTrailingSlashes(hdfsDataDir)
-                + "/"
-                + path
-                + "/"
-                + cd.getDataDir()));
+            trimLeadingAndTrailingSlashes(hdfsDataDir) + "/" + path + "/" + cd.getDataDir()));
   }
 
   /**
@@ -724,4 +719,21 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory
   public UpdateLog newDefaultUpdateLog() {
     return new HdfsUpdateLog(getConfDir());
   }
+
+  /**
+   * Utility method for trimming and leading and/or trailing slashes from its input. May return the
+   * empty string. May return null if and only if the input is null.
+   */
+  public static String trimLeadingAndTrailingSlashes(final String in) {
+    if (null == in) return in;
+
+    String out = in;
+    if (out.startsWith("/")) {
+      out = out.substring(1);
+    }
+    if (out.endsWith("/")) {
+      out = out.substring(0, out.length() - 1);
+    }
+    return out;
+  }
 }
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCloudIncrementalBackupTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCloudIncrementalBackupTest.java
index 9ae15f86e0b..aed608ef37b 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCloudIncrementalBackupTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCloudIncrementalBackupTest.java
@@ -66,7 +66,6 @@ public class HdfsCloudIncrementalBackupTest extends AbstractIncrementalBackupTes
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/TestHdfsCloudBackupRestore.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/TestHdfsCloudBackupRestore.java
index 38e0e221874..9cb6c9ec25a 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/TestHdfsCloudBackupRestore.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/TestHdfsCloudBackupRestore.java
@@ -88,7 +88,6 @@ public class TestHdfsCloudBackupRestore extends AbstractCloudBackupRestoreTestCa
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/handler/TestHdfsBackupRestoreCore.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/handler/TestHdfsBackupRestoreCore.java
index 0bdfc507403..29674f74886 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/handler/TestHdfsBackupRestoreCore.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/handler/TestHdfsBackupRestoreCore.java
@@ -92,7 +92,6 @@ public class TestHdfsBackupRestoreCore extends SolrCloudTestCase {
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/modules/ltr/src/test-files/solr/solr.xml b/solr/modules/ltr/src/test-files/solr/solr.xml
index c8c3ebeb30a..7506c1c8951 100644
--- a/solr/modules/ltr/src/test-files/solr/solr.xml
+++ b/solr/modules/ltr/src/test-files/solr/solr.xml
@@ -31,7 +31,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">${leaderVoteWait:10000}</int>
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java
index ce5aa367d39..816fccab2d7 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/TestLTROnSolrCloud.java
@@ -323,7 +323,7 @@ public class TestLTROnSolrCloud extends TestRerankBase {
   }
 
   private void setupSolrCluster(int numShards, int numReplicas, int numServers) throws Exception {
-    JettyConfig jc = buildJettyConfig("/solr");
+    JettyConfig jc = buildJettyConfig();
     jc = JettyConfig.builder(jc).build();
     solrCluster = new MiniSolrCloudCluster(numServers, tmpSolrHome, jc);
     Path configDir = tmpSolrHome.resolve("collection1/conf");
diff --git a/solr/modules/opentelemetry/src/test-files/solr/solr.xml b/solr/modules/opentelemetry/src/test-files/solr/solr.xml
index 725934bd0a6..6ad63be5e84 100644
--- a/solr/modules/opentelemetry/src/test-files/solr/solr.xml
+++ b/solr/modules/opentelemetry/src/test-files/solr/solr.xml
@@ -39,7 +39,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">${leaderVoteWait:10000}</int>
@@ -54,4 +53,4 @@
       <str name="rootName">solr_${hostPort:8983}</str>
     </reporter>
   </metrics>
-</solr>
\ No newline at end of file
+</solr>
diff --git a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
index 48c462da548..7214fe6418b 100644
--- a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
+++ b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
@@ -60,7 +60,6 @@ public class S3IncrementalBackupTest extends AbstractIncrementalBackupTest {
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/prometheus-exporter/src/test-files/solr/solr.xml b/solr/prometheus-exporter/src/test-files/solr/solr.xml
index f87a5876fc8..33ea82a72c5 100644
--- a/solr/prometheus-exporter/src/test-files/solr/solr.xml
+++ b/solr/prometheus-exporter/src/test-files/solr/solr.xml
@@ -32,7 +32,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">${leaderVoteWait:10000}</int>
diff --git a/solr/server/solr/solr.xml b/solr/server/solr/solr.xml
index 17783906c6c..d309f18cb40 100644
--- a/solr/server/solr/solr.xml
+++ b/solr/server/solr/solr.xml
@@ -38,7 +38,6 @@
 
     <str name="host">${host:}</str>
     <int name="hostPort">${solr.port.advertise:0}</int>
-    <str name="hostContext">${hostContext:solr}</str>
 
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
 
diff --git a/solr/solr-ref-guide/modules/configuration-guide/pages/configuring-solr-xml.adoc b/solr/solr-ref-guide/modules/configuration-guide/pages/configuring-solr-xml.adoc
index fe6348c4c0a..8fd032db318 100644
--- a/solr/solr-ref-guide/modules/configuration-guide/pages/configuring-solr-xml.adoc
+++ b/solr/solr-ref-guide/modules/configuration-guide/pages/configuring-solr-xml.adoc
@@ -44,7 +44,6 @@ The default `solr.xml` file is found in `$SOLR_TIP/server/solr/solr.xml` and loo
 
     <str name="host">${host:}</str>
     <int name="hostPort">${solr.port.advertise:0}</int>
-    <str name="hostContext">${hostContext:solr}</str>
 
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
 
@@ -354,15 +353,6 @@ Used to set the underlying `socketTimeout` for intra-cluster updates.
 +
 The hostname Solr uses to access cores.
 
-`hostContext`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: none
-|===
-+
-The url context path.
-
 `hostPort`::
 +
 [%autowidth,frame=none]
diff --git a/solr/solrj-streaming/src/test-files/solrj/solr/solr.xml b/solr/solrj-streaming/src/test-files/solrj/solr/solr.xml
index 76d992170f1..c4413d38ce3 100644
--- a/solr/solrj-streaming/src/test-files/solrj/solr/solr.xml
+++ b/solr/solrj-streaming/src/test-files/solrj/solr/solr.xml
@@ -36,7 +36,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">0</int>
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index a796872a825..391ad2eaed2 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -38,7 +38,6 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.net.URL;
-import java.net.URLDecoder;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -711,8 +710,7 @@ public class Utils {
           "nodeName does not contain expected '_' separator: " + nodeName);
     }
     final String hostAndPort = nodeName.substring(0, _offset);
-    final String path = URLDecoder.decode(nodeName.substring(1 + _offset), UTF_8);
-    return urlScheme + "://" + hostAndPort + (path.isEmpty() ? "" : ("/" + (isV2 ? "api" : path)));
+    return urlScheme + "://" + hostAndPort + "/" + (isV2 ? "api" : "solr");
   }
 
   public static long time(TimeSource timeSource, TimeUnit unit) {
diff --git a/solr/solrj/src/test-files/solrj/solr/shared/solr.xml b/solr/solrj/src/test-files/solrj/solr/shared/solr.xml
index 75e95f79b0b..aefabeaa6a2 100644
--- a/solr/solrj/src/test-files/solrj/solr/shared/solr.xml
+++ b/solr/solrj/src/test-files/solrj/solr/shared/solr.xml
@@ -31,7 +31,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">0</int>
diff --git a/solr/solrj/src/test-files/solrj/solr/solr.xml b/solr/solrj/src/test-files/solrj/solr/solr.xml
index 76d992170f1..c4413d38ce3 100644
--- a/solr/solrj/src/test-files/solrj/solr/solr.xml
+++ b/solr/solrj/src/test-files/solrj/solr/solr.xml
@@ -36,7 +36,6 @@
   <solrcloud>
     <str name="host">127.0.0.1</str>
     <int name="hostPort">${hostPort:8983}</int>
-    <str name="hostContext">${hostContext:solr}</str>
     <int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
     <int name="leaderVoteWait">0</int>
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java
index aa523e2f5e0..60e3cff52cd 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java
@@ -271,7 +271,7 @@ public class TestLBHttp2SolrClient extends SolrTestCaseJ4 {
     }
 
     public String getUrl() {
-      return buildUrl(port, "/solr/collection1");
+      return buildUrl(port) + "/collection1";
     }
 
     public String getSchemaFile() {
@@ -320,8 +320,7 @@ public class TestLBHttp2SolrClient extends SolrTestCaseJ4 {
       props.setProperty("solrconfig", "bad_solrconfig.xml");
       props.setProperty("solr.data.dir", getDataDir());
 
-      JettyConfig jettyConfig =
-          JettyConfig.builder(buildJettyConfig("/solr")).setPort(port).build();
+      JettyConfig jettyConfig = JettyConfig.builder(buildJettyConfig()).setPort(port).build();
 
       jetty = new JettySolrRunner(getHomeDir(), props, jettyConfig);
       jetty.start();
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java
index c251afdba91..f53139d53ba 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java
@@ -274,7 +274,7 @@ public class TestLBHttpSolrClient extends SolrTestCaseJ4 {
     }
 
     public String getUrl() {
-      return buildUrl(port, "/solr/collection1");
+      return buildUrl(port) + "/collection1";
     }
 
     public String getSchemaFile() {
@@ -323,8 +323,7 @@ public class TestLBHttpSolrClient extends SolrTestCaseJ4 {
       props.setProperty("solrconfig", "bad_solrconfig.xml");
       props.setProperty("solr.data.dir", getDataDir());
 
-      JettyConfig jettyConfig =
-          JettyConfig.builder(buildJettyConfig("/solr")).setPort(port).build();
+      JettyConfig jettyConfig = JettyConfig.builder(buildJettyConfig()).setPort(port).build();
 
       jetty = new JettySolrRunner(getHomeDir(), props, jettyConfig);
       jetty.start();
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java
index 20b651e4f9f..ec631da7081 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/JettyWebappTest.java
@@ -43,7 +43,6 @@ import org.eclipse.jetty.webapp.WebAppContext;
  */
 public class JettyWebappTest extends SolrTestCaseJ4 {
   int port = 0;
-  static final String context = "/test";
 
   Server server;
 
@@ -64,7 +63,7 @@ public class JettyWebappTest extends SolrTestCaseJ4 {
     // insecure: only use for tests!!!!
     server.setSessionIdManager(
         new DefaultSessionIdManager(server, new Random(random().nextLong())));
-    new WebAppContext(server, path, context);
+    new WebAppContext(server, path, "/solr");
 
     ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory());
     connector.setIdleTimeout(1000 * 60 * 60);
@@ -89,10 +88,8 @@ public class JettyWebappTest extends SolrTestCaseJ4 {
   }
 
   public void testAdminUI() throws Exception {
-    // Currently not an extensive test, but it does fire up the JSP pages and make
-    // sure they compile ok
-
-    String adminPath = "http://127.0.0.1:" + port + context + "/";
+    // Not an extensive test, but it does connect to Solr and verify the Admin ui shows up.
+    String adminPath = "http://127.0.0.1:" + port + "/solr/";
     try (InputStream is = new URL(adminPath).openStream()) {
       assertNotNull(is.readAllBytes()); // real error will be an exception
     }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/TestCloudSolrClientConnections.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/TestCloudSolrClientConnections.java
index 20853430218..d678106f873 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/TestCloudSolrClientConnections.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/TestCloudSolrClientConnections.java
@@ -32,8 +32,7 @@ public class TestCloudSolrClientConnections extends SolrTestCaseJ4 {
   public void testCloudClientCanConnectAfterClusterComesUp() throws Exception {
 
     // Start by creating a cluster with no jetties
-    MiniSolrCloudCluster cluster =
-        new MiniSolrCloudCluster(0, createTempDir(), buildJettyConfig("/solr"));
+    MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(0, createTempDir(), buildJettyConfig());
     try {
 
       CloudSolrClient client = cluster.getSolrClient();
@@ -61,8 +60,7 @@ public class TestCloudSolrClientConnections extends SolrTestCaseJ4 {
 
     Path configPath = getFile("solrj").toPath().resolve("solr/configsets/configset-2/conf");
 
-    MiniSolrCloudCluster cluster =
-        new MiniSolrCloudCluster(0, createTempDir(), buildJettyConfig("/solr"));
+    MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(0, createTempDir(), buildJettyConfig());
     try {
       CloudSolrClient client = cluster.getSolrClient();
       SolrException e =
@@ -94,9 +92,9 @@ public class TestCloudSolrClientConnections extends SolrTestCaseJ4 {
   public void testAlreadyClosedClusterStateProvider() throws Exception {
 
     final MiniSolrCloudCluster cluster =
-        new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+        new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig());
     // from a client perspective the behavior of ZkClientClusterStateProvider should be
-    // consistent regardless of wether it's constructed with a zkhost or an existing ZkStateReader
+    // consistent regardless of whether it's constructed with a zkhost or an existing ZkStateReader
     try {
       final ZkClientClusterStateProvider zkHost_provider =
           new ZkClientClusterStateProvider(cluster.getZkServer().getZkAddress());
diff --git a/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java b/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
index ff3b8a17c8c..d466d993a48 100644
--- a/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
@@ -46,7 +46,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import javax.servlet.Filter;
 import org.apache.commons.io.FileUtils;
-import org.apache.lucene.tests.util.TestUtil;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrResponse;
@@ -122,60 +121,6 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
     r = new Random(random().nextLong());
   }
 
-  /**
-   * Set's the value of the "hostContext" system property to a random path like string (which may or
-   * may not contain sub-paths). This is used in the default constructor for this test to help
-   * ensure no code paths have hardcoded assumptions about the servlet context used to run solr.
-   *
-   * <p>Test configs may use the <code>${hostContext}</code> variable to access this system
-   * property.
-   *
-   * @see #BaseDistributedSearchTestCase()
-   * @see #clearHostContext
-   */
-  @BeforeClass
-  public static void initHostContext() {
-    // Can't use randomRealisticUnicodeString because unescaped unicode is
-    // not allowed in URL paths
-    // Can't use URLEncoder.encode(randomRealisticUnicodeString) because
-    // Jetty freaks out and returns 404's when the context uses escapes
-
-    StringBuilder hostContext = new StringBuilder("/");
-    if (random().nextBoolean()) {
-      // half the time we use the root context, the other half...
-
-      // Remember: randomSimpleString might be the empty string
-      hostContext.append(TestUtil.randomSimpleString(random(), 2));
-      if (random().nextBoolean()) {
-        hostContext.append("_");
-      }
-      hostContext.append(TestUtil.randomSimpleString(random(), 3));
-      if (!"/".equals(hostContext.toString())) {
-        // if our random string is empty, this might add a trailing slash,
-        // but our code should be ok with that
-        hostContext.append("/").append(TestUtil.randomSimpleString(random(), 2));
-      } else {
-        // we got 'lucky' and still just have the root context,
-        // NOOP: don't try to add a subdir to nothing (ie "//" is bad)
-      }
-    }
-    // paranoia, we *really* don't want to ever get "//" in a path...
-    final String hc = hostContext.toString().replaceAll("/+", "/");
-
-    log.info("Setting hostContext system property: {}", hc);
-    System.setProperty("hostContext", hc);
-  }
-
-  /**
-   * Clears the "hostContext" system property
-   *
-   * @see #initHostContext
-   */
-  @AfterClass
-  public static void clearHostContext() throws Exception {
-    System.clearProperty("hostContext");
-  }
-
   @SuppressWarnings("deprecation")
   @BeforeClass
   public static void setSolrDisableShardsWhitelist() throws Exception {
@@ -189,40 +134,17 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
   }
 
   private static String getHostContextSuitableForServletContext() {
-    String ctx = System.getProperty("hostContext", "/solr");
-    if (ctx == null || ctx.isEmpty()) ctx = "/solr";
-    if (ctx.endsWith("/")) ctx = ctx.substring(0, ctx.length() - 1);
-    if (!ctx.startsWith("/")) ctx = "/" + ctx;
-    return ctx;
+    return "/solr";
   }
 
-  /**
-   * Constructs a test in which the jetty+solr instances as well as the solr clients all use the
-   * value of the "hostContext" system property.
-   *
-   * <p>If the system property is not set, or is set to the empty string (neither of which should
-   * normally happen unless a subclass explicitly modifies the property set by {@link
-   * #initHostContext} prior to calling this constructor) a servlet context of "/solr" is used.
-   * (this is for consistency with the default behavior of solr.xml parsing when using <code>
-   * hostContext="${hostContext:}"</code>
-   *
-   * <p>If the system property is set to a value which does not begin with a "/" (which should
-   * normally happen unless a subclass explicitly modifies the property set by {@link
-   * #initHostContext} prior to calling this constructor) a leading "/" will be prepended.
-   *
-   * @see #initHostContext
-   */
   protected BaseDistributedSearchTestCase() {
-    this(getHostContextSuitableForServletContext());
-  }
-
-  /**
-   * @param context explicit servlet context path to use (eg: "/solr")
-   */
-  protected BaseDistributedSearchTestCase(final String context) {
-    this.context = context;
+    String solrHostContext = "/solr";
     this.deadServers =
-        new String[] {DEAD_HOST_1 + context, DEAD_HOST_2 + context, DEAD_HOST_3 + context};
+        new String[] {
+          DEAD_HOST_1 + solrHostContext,
+          DEAD_HOST_2 + solrHostContext,
+          DEAD_HOST_3 + solrHostContext
+        };
 
     // Speed up the test cycle by only running a single configuration instead of the repeat rule
     if (TEST_NIGHTLY == false) {
@@ -250,7 +172,6 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
   protected final List<SolrClient> clients = Collections.synchronizedList(new ArrayList<>());
   protected final List<JettySolrRunner> jettys = Collections.synchronizedList(new ArrayList<>());
 
-  protected volatile String context;
   protected volatile String[] deadServers;
   protected volatile String shards;
   protected volatile String[] shardsArr;
@@ -508,7 +429,6 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
             props,
             JettyConfig.builder()
                 .stopAtShutdown(true)
-                .setContext(context)
                 .withFilters(getExtraRequestFilters())
                 .withServlets(getExtraServlets())
                 .withSSLConfig(sslConfig.buildServerSSLConfig())
@@ -546,10 +466,6 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
     }
   }
 
-  protected String buildUrl(int port) {
-    return buildUrl(port, context);
-  }
-
   protected static void addFields(SolrInputDocument doc, Object... fields) {
     for (int i = 0; i < fields.length; i += 2) {
       doc.addField((String) (fields[i]), fields[i + 1]);
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java b/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
index 3f946add592..2042b24a498 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrJettyTestBase.java
@@ -69,7 +69,6 @@ public abstract class SolrJettyTestBase extends SolrTestCaseJ4 {
 
     JettyConfig jettyConfig =
         JettyConfig.builder()
-            .setContext(context)
             .stopAtShutdown(stopAtShutdown)
             .withServlets(extraServlets)
             .withSSLConfig(sslConfig.buildServerSSLConfig())
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java
index 42dc8b3aeb7..26234b5e9f3 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseHS.java
@@ -510,7 +510,6 @@ public class SolrTestCaseHS extends SolrTestCaseJ4 {
         JettyConfig jettyConfig =
             JettyConfig.builder()
                 .stopAtShutdown(true)
-                .setContext("/solr")
                 .setPort(port)
                 .withSSLConfig(sslConfig.buildServerSSLConfig())
                 .build();
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index 47e0b473fb9..ba96e729562 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -520,15 +520,12 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     return result;
   }
 
-  protected static JettyConfig buildJettyConfig(String context) {
-    return JettyConfig.builder()
-        .setContext(context)
-        .withSSLConfig(sslConfig.buildServerSSLConfig())
-        .build();
+  protected static JettyConfig buildJettyConfig() {
+    return JettyConfig.builder().withSSLConfig(sslConfig.buildServerSSLConfig()).build();
   }
 
-  protected static String buildUrl(final int port, final String context) {
-    return (isSSLMode() ? "https" : "http") + "://127.0.0.1:" + port + context;
+  protected static String buildUrl(final int port) {
+    return (isSSLMode() ? "https" : "http") + "://127.0.0.1:" + port + "/solr";
   }
 
   protected static MockTokenizer whitespaceMockTokenizer(Reader input) throws IOException {
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index b21aa73831a..e2f2074873d 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -729,7 +729,6 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
 
     JettyConfig jettyconfig =
         JettyConfig.builder()
-            .setContext(context)
             .stopAtShutdown(false)
             .withServlets(getExtraServlets())
             .withFilters(getExtraRequestFilters())
@@ -775,7 +774,6 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
 
     JettyConfig jettyconfig =
         JettyConfig.builder()
-            .setContext(context)
             .stopAtShutdown(false)
             .withServlets(getExtraServlets())
             .withFilters(getExtraRequestFilters())
@@ -814,7 +812,6 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
 
     JettyConfig jettyconfig =
         JettyConfig.builder()
-            .setContext(context)
             .stopAtShutdown(false)
             .withServlets(getExtraServlets())
             .withFilters(getExtraRequestFilters())
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
index 704cbfa8589..3a4d41d0420 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
@@ -121,7 +121,6 @@ public class MiniSolrCloudCluster {
           + "  <solrcloud>\n"
           + "    <str name=\"host\">127.0.0.1</str>\n"
           + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-          + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
           + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
           + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
           + "    <int name=\"leaderVoteWait\">${leaderVoteWait:10000}</int>\n"
@@ -177,61 +176,6 @@ public class MiniSolrCloudCluster {
     this(numServers, baseDir, DEFAULT_CLOUD_SOLR_XML, jettyConfig, null, false);
   }
 
-  /**
-   * Create a MiniSolrCloudCluster
-   *
-   * @param numServers number of Solr servers to start
-   * @param hostContext context path of Solr servers used by Jetty
-   * @param baseDir base directory that the mini cluster should be run from
-   * @param solrXml solr.xml file to be uploaded to ZooKeeper
-   * @param extraServlets Extra servlets to be started by Jetty
-   * @param extraRequestFilters extra filters to be started by Jetty
-   * @throws Exception if there was an error starting the cluster
-   */
-  public MiniSolrCloudCluster(
-      int numServers,
-      String hostContext,
-      Path baseDir,
-      String solrXml,
-      SortedMap<ServletHolder, String> extraServlets,
-      SortedMap<Class<? extends Filter>, String> extraRequestFilters)
-      throws Exception {
-    this(numServers, hostContext, baseDir, solrXml, extraServlets, extraRequestFilters, null);
-  }
-
-  /**
-   * Create a MiniSolrCloudCluster
-   *
-   * @param numServers number of Solr servers to start
-   * @param hostContext context path of Solr servers used by Jetty
-   * @param baseDir base directory that the mini cluster should be run from
-   * @param solrXml solr.xml file to be uploaded to ZooKeeper
-   * @param extraServlets Extra servlets to be started by Jetty
-   * @param extraRequestFilters extra filters to be started by Jetty
-   * @param sslConfig SSL configuration
-   * @throws Exception if there was an error starting the cluster
-   */
-  public MiniSolrCloudCluster(
-      int numServers,
-      String hostContext,
-      Path baseDir,
-      String solrXml,
-      SortedMap<ServletHolder, String> extraServlets,
-      SortedMap<Class<? extends Filter>, String> extraRequestFilters,
-      SSLConfig sslConfig)
-      throws Exception {
-    this(
-        numServers,
-        baseDir,
-        solrXml,
-        JettyConfig.builder()
-            .setContext(hostContext)
-            .withSSLConfig(sslConfig)
-            .withFilters(extraRequestFilters)
-            .withServlets(extraServlets)
-            .build());
-  }
-
   /**
    * Create a MiniSolrCloudCluster
    *
@@ -370,7 +314,7 @@ public class MiniSolrCloudCluster {
 
     List<Callable<JettySolrRunner>> startups = new ArrayList<>(numServers);
     for (int i = 0; i < numServers; ++i) {
-      startups.add(() -> startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig));
+      startups.add(() -> startJettySolrRunner(newNodeName(), jettyConfig));
     }
 
     final ExecutorService executorLauncher =
@@ -510,13 +454,12 @@ public class MiniSolrCloudCluster {
       SortedMap<ServletHolder, String> extraServlets,
       SortedMap<Class<? extends Filter>, String> extraRequestFilters)
       throws Exception {
-    return startJettySolrRunner(name, hostContext, extraServlets, extraRequestFilters, null);
+    return startJettySolrRunner(name, extraServlets, extraRequestFilters, null);
   }
 
   /**
    * Start a new Solr instance
    *
-   * @param hostContext context path of Solr servers used by Jetty
    * @param extraServlets Extra servlets to be started by Jetty
    * @param extraRequestFilters extra filters to be started by Jetty
    * @param sslConfig SSL configuration
@@ -524,14 +467,12 @@ public class MiniSolrCloudCluster {
    */
   public JettySolrRunner startJettySolrRunner(
       String name,
-      String hostContext,
       SortedMap<ServletHolder, String> extraServlets,
       SortedMap<Class<? extends Filter>, String> extraRequestFilters,
       SSLConfig sslConfig)
       throws Exception {
     return startJettySolrRunner(
         name,
-        hostContext,
         JettyConfig.builder()
             .withServlets(extraServlets)
             .withFilters(extraRequestFilters)
@@ -547,19 +488,16 @@ public class MiniSolrCloudCluster {
    * Start a new Solr instance on a particular servlet context
    *
    * @param name the instance name
-   * @param hostContext the context to run on
    * @param config a JettyConfig for the instance's {@link org.apache.solr.embedded.JettySolrRunner}
    * @return a JettySolrRunner
    */
-  public JettySolrRunner startJettySolrRunner(String name, String hostContext, JettyConfig config)
-      throws Exception {
+  public JettySolrRunner startJettySolrRunner(String name, JettyConfig config) throws Exception {
     // tell solr node to look in zookeeper for solr.xml
     final Properties nodeProps = new Properties();
     nodeProps.setProperty("zkHost", zkServer.getZkAddress());
 
     Path runnerPath = createInstancePath(name);
-    String context = getHostContextSuitableForServletContext(hostContext);
-    JettyConfig newConfig = JettyConfig.builder(config).setContext(context).build();
+    JettyConfig newConfig = JettyConfig.builder(config).build();
     JettySolrRunner jetty =
         !trackJettyMetrics
             ? new JettySolrRunner(runnerPath.toString(), nodeProps, newConfig)
@@ -578,7 +516,7 @@ public class MiniSolrCloudCluster {
    * @return a JettySolrRunner
    */
   public JettySolrRunner startJettySolrRunner() throws Exception {
-    return startJettySolrRunner(newNodeName(), jettyConfig.context, jettyConfig);
+    return startJettySolrRunner(newNodeName(), jettyConfig);
   }
 
   /**
@@ -1117,7 +1055,7 @@ public class MiniSolrCloudCluster {
       this.nodeCount = nodeCount;
       this.baseDir = baseDir;
 
-      jettyConfigBuilder = JettyConfig.builder().setContext("/solr");
+      jettyConfigBuilder = JettyConfig.builder();
       if (SolrTestCaseJ4.sslConfig != null) {
         jettyConfigBuilder =
             jettyConfigBuilder.withSSLConfig(SolrTestCaseJ4.sslConfig.buildServerSSLConfig());
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractInstallShardTest.java b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractInstallShardTest.java
index 8bcd85077b7..70f1a38e18e 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractInstallShardTest.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractInstallShardTest.java
@@ -224,7 +224,6 @@ public abstract class AbstractInstallShardTest extends SolrCloudTestCase {
         + "  <solrcloud>\n"
         + "    <str name=\"host\">127.0.0.1</str>\n"
         + "    <int name=\"hostPort\">${hostPort:8983}</int>\n"
-        + "    <str name=\"hostContext\">${hostContext:solr}</str>\n"
         + "    <int name=\"zkClientTimeout\">${solr.zkclienttimeout:30000}</int>\n"
         + "    <bool name=\"genericCoreNodeNames\">${genericCoreNodeNames:true}</bool>\n"
         + "    <int name=\"leaderVoteWait\">10000</int>\n"
diff --git a/solr/test-framework/src/java/org/apache/solr/embedded/JettyConfig.java b/solr/test-framework/src/java/org/apache/solr/embedded/JettyConfig.java
index b03b1c234db..cbaad484503 100644
--- a/solr/test-framework/src/java/org/apache/solr/embedded/JettyConfig.java
+++ b/solr/test-framework/src/java/org/apache/solr/embedded/JettyConfig.java
@@ -28,7 +28,6 @@ public class JettyConfig {
   public final boolean onlyHttp1;
   public final int port;
   public final int portRetryTime;
-  public final String context;
   public final boolean stopAtShutdown;
   public final Long waitForLoadingCoresToFinishMs;
   public final Map<ServletHolder, String> extraServlets;
@@ -40,7 +39,6 @@ public class JettyConfig {
       boolean onlyHttp1,
       int port,
       int portRetryTime,
-      String context,
       boolean stopAtShutdown,
       Long waitForLoadingCoresToFinishMs,
       Map<ServletHolder, String> extraServlets,
@@ -50,7 +48,6 @@ public class JettyConfig {
     this.onlyHttp1 = onlyHttp1;
     this.port = port;
     this.portRetryTime = portRetryTime;
-    this.context = context;
     this.stopAtShutdown = stopAtShutdown;
     this.waitForLoadingCoresToFinishMs = waitForLoadingCoresToFinishMs;
     this.extraServlets = extraServlets;
@@ -69,7 +66,6 @@ public class JettyConfig {
     builder.onlyHttp1 = other.onlyHttp1;
     builder.port = other.port;
     builder.portRetryTime = other.portRetryTime;
-    builder.context = other.context;
     builder.stopAtShutdown = other.stopAtShutdown;
     builder.waitForLoadingCoresToFinishMs = other.waitForLoadingCoresToFinishMs;
     builder.extraServlets = other.extraServlets;
@@ -83,7 +79,6 @@ public class JettyConfig {
 
     boolean onlyHttp1 = false;
     int port = 0;
-    String context = "/solr";
     boolean enableV2 = true;
     boolean stopAtShutdown = true;
     Long waitForLoadingCoresToFinishMs = 300000L;
@@ -107,11 +102,6 @@ public class JettyConfig {
       return this;
     }
 
-    public Builder setContext(String context) {
-      this.context = context;
-      return this;
-    }
-
     public Builder stopAtShutdown(boolean stopAtShutdown) {
       this.stopAtShutdown = stopAtShutdown;
       return this;
@@ -157,7 +147,6 @@ public class JettyConfig {
           onlyHttp1,
           port,
           portRetryTime,
-          context,
           stopAtShutdown,
           waitForLoadingCoresToFinishMs,
           extraServlets,
diff --git a/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java b/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java
index 27d3052e74a..1130df5d7ce 100644
--- a/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java
+++ b/solr/test-framework/src/java/org/apache/solr/embedded/JettySolrRunner.java
@@ -217,11 +217,10 @@ public class JettySolrRunner {
    * <p>After construction, you must start the jetty with {@link #start()}
    *
    * @param solrHome the solr home directory to use
-   * @param context the context to run in
    * @param port the port to run on
    */
-  public JettySolrRunner(String solrHome, String context, int port) {
-    this(solrHome, JettyConfig.builder().setContext(context).setPort(port).build());
+  public JettySolrRunner(String solrHome, int port) {
+    this(solrHome, JettyConfig.builder().setPort(port).build());
   }
 
   /**
@@ -373,7 +372,7 @@ public class JettySolrRunner {
     {
       // Initialize the servlets
       final ServletContextHandler root =
-          new ServletContextHandler(server, config.context, ServletContextHandler.SESSIONS);
+          new ServletContextHandler(server, "/solr", ServletContextHandler.SESSIONS);
       root.setResourceBase(".");
 
       server.addEventListener(
@@ -396,7 +395,6 @@ public class JettySolrRunner {
               int port = jettyPort;
               if (proxyPort != -1) port = proxyPort;
               nodeProperties.setProperty("hostPort", Integer.toString(port));
-              nodeProperties.setProperty("hostContext", config.context);
 
               root.getServletContext()
                   .setAttribute(SolrDispatchFilter.PROPERTIES_ATTRIBUTE, nodeProperties);
@@ -840,7 +838,7 @@ public class JettySolrRunner {
    */
   public URL getBaseUrl() {
     try {
-      return new URL(protocol, host, jettyPort, config.context);
+      return new URL(protocol, host, jettyPort, "/solr");
     } catch (MalformedURLException e) {
       throw new RuntimeException(e);
     }
@@ -859,7 +857,7 @@ public class JettySolrRunner {
    */
   public URL getProxyBaseUrl() {
     try {
-      return new URL(protocol, host, getLocalPort(), config.context);
+      return new URL(protocol, host, getLocalPort(), "/solr");
     } catch (MalformedURLException e) {
       throw new RuntimeException(e);
     }
@@ -893,7 +891,7 @@ public class JettySolrRunner {
 
   /** A main class that starts jetty+solr This is useful for debugging */
   public static void main(String[] args) throws Exception {
-    JettySolrRunner jetty = new JettySolrRunner(".", "/solr", 8983);
+    JettySolrRunner jetty = new JettySolrRunner(".", 8983);
     jetty.start();
   }
 
diff --git a/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java b/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
index 662b23f08ea..3384a03d0be 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/TestHarness.java
@@ -189,9 +189,7 @@ public class TestHarness extends BaseTestHarness {
         (null == System.getProperty("zkHost"))
             ? null
             : new CloudConfig.CloudConfigBuilder(
-                    System.getProperty("host"),
-                    Integer.getInteger("hostPort", 8983),
-                    System.getProperty("hostContext", ""))
+                    System.getProperty("host"), Integer.getInteger("hostPort", 8983))
                 .setZkClientTimeout(Integer.getInteger("zkClientTimeout", 30000))
                 .setZkHost(System.getProperty("zkHost"))
                 .build();
diff --git a/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java b/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java
index 26024ff548d..49b68a134fb 100644
--- a/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java
+++ b/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java
@@ -56,10 +56,10 @@ public class MiniSolrCloudClusterTest extends SolrTestCaseJ4 {
       cluster =
           new MiniSolrCloudCluster(3, createTempDir(), JettyConfig.builder().build()) {
             @Override
-            public JettySolrRunner startJettySolrRunner(
-                String name, String context, JettyConfig config) throws Exception {
+            public JettySolrRunner startJettySolrRunner(String name, JettyConfig config)
+                throws Exception {
               if (jettyIndex.incrementAndGet() != 2)
-                return super.startJettySolrRunner(name, context, config);
+                return super.startJettySolrRunner(name, config);
               throw new IOException("Fake exception on startup!");
             }
           };
@@ -199,15 +199,15 @@ public class MiniSolrCloudClusterTest extends SolrTestCaseJ4 {
       final MiniSolrCloudCluster x =
           new MiniSolrCloudCluster(1, createTempDir(), JettyConfig.builder().build()) {
             @Override
-            public JettySolrRunner startJettySolrRunner(
-                String name, String hostContext, JettyConfig config) throws Exception {
+            public JettySolrRunner startJettySolrRunner(String name, JettyConfig config)
+                throws Exception {
               System.setProperty("zkHost", getZkServer().getZkAddress());
 
               final Properties nodeProps = new Properties();
               nodeProps.setProperty("test-from-sysprop", "yup");
 
               Path runnerPath = createTempDir(name);
-              JettyConfig newConfig = JettyConfig.builder(config).setContext("/blarfh").build();
+              JettyConfig newConfig = JettyConfig.builder(config).build();
               JettySolrRunner jetty =
                   new JettySolrRunner(runnerPath.toString(), nodeProps, newConfig);
               return super.startJettySolrRunner(jetty);
diff --git a/solr/test-framework/src/test/org/apache/solr/embedded/TestJettySolrRunner.java b/solr/test-framework/src/test/org/apache/solr/embedded/TestJettySolrRunner.java
index 2fc1299a734..34f48b79fe4 100644
--- a/solr/test-framework/src/test/org/apache/solr/embedded/TestJettySolrRunner.java
+++ b/solr/test-framework/src/test/org/apache/solr/embedded/TestJettySolrRunner.java
@@ -48,7 +48,7 @@ public class TestJettySolrRunner extends SolrTestCaseJ4 {
             .replace("COREROOT", coresDir.toString());
     Files.write(solrHome.resolve("solr.xml"), solrxml.getBytes(StandardCharsets.UTF_8));
 
-    JettyConfig jettyConfig = buildJettyConfig("/solr");
+    JettyConfig jettyConfig = buildJettyConfig();
 
     JettySolrRunner runner =
         new JettySolrRunner(solrHome.toString(), new Properties(), jettyConfig);