{"id":136870,"date":"2026-06-08T05:05:35","date_gmt":"2026-06-08T02:05:35","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/"},"modified":"2026-06-08T05:05:35","modified_gmt":"2026-06-08T02:05:35","slug":"secureredirect","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/","title":{"rendered":"SecureRedirect"},"content":{"rendered":"<p># SecureRedirect Setup Guide<\/p>\n<p>This guide explains how to install and configure the **SecureRedirect** Paper plugin so players can be securely redirected from one server (&#8220;main&#8221;) to another (&#8220;dest&#8221;) using transfer packets and cookies.<\/p>\n<p>> Recommended Paper version: **1.21.11** (or later with `Player#transfer` support)<\/p>\n<p>> **DISCLAIMER!!! YOU MUST JOIN THE SERVER WITH A PORT!!!**<br \/>\n&#8212;<\/p>\n<details>\n<summary><strong>1. Install the plugin<\/strong><\/summary>\n<p>### 1.1. Build or download the JAR<\/p>\n<p>If you are using this repo directly:<\/p>\n<p>1. Run:<br \/>\n   &#8220;`bash<br \/>\n   gradle build<br \/>\n   &#8220;`<br \/>\n2. The plugin JAR will be at:<br \/>\n   &#8211; `build\/libs\/SecureRedirect-1.0.2.jar`<\/p>\n<p>Copy that JAR to each Paper server that should participate in redirects.<\/p>\n<p>### 1.2. Drop the plugin into each server<\/p>\n<p>For **each** Paper server (main and dest):<\/p>\n<p>1. Stop the server if it is running.<br \/>\n2. Place `SecureRedirect-1.0.2.jar` into the `plugins\/` folder.<br \/>\n3. Start the server once so it generates `plugins\/SecureRedirect\/config.yml`.<\/p>\n<\/details>\n<p>&#8212;<\/p>\n<details>\n<summary><strong>2. Configure the main (source) server<\/strong><\/summary>\n<p>This is the server where players join normally and run `\/redirect`.<\/p>\n<p>Edit `plugins\/SecureRedirect\/config.yml` on the **main** server.<\/p>\n<p>### 2.1. Basic redirect target<\/p>\n<p>&#8220;`yaml<br \/>\n# Where to send players when using \/redirect on MAIN<br \/>\ntarget-host: &#8220;your-dest-host&#8221;   # e.g. &#8220;hello.exaroton.me&#8221;<br \/>\n# Optional. If omitted or invalid, defaults to 25565.<br \/>\n# target-port: 25565<\/p>\n<p># Will be filled by \/redirect gen-hash<br \/>\nsend-hash: &#8220;&#8221;<\/p>\n<p># Not required on MAIN, can be left empty<br \/>\nreceive-hash: &#8220;&#8221;<\/p>\n<p># Players can join MAIN directly<br \/>\nrequire-transfer: false<br \/>\n&#8220;`<\/p>\n<p>Notes:<br \/>\n&#8211; If your destination uses the **default port 25565**, you can omit `target-port` entirely.<br \/>\n&#8211; If your destination uses a custom port (e.g. `25566`), set it explicitly:<br \/>\n  &#8220;`yaml<br \/>\n  target-port: 25566<br \/>\n  &#8220;`<\/p>\n<p>### 2.2. Origin ID (optional)<\/p>\n<p>&#8220;`yaml<br \/>\n# Identifier this server uses when redirecting players<br \/>\norigin-id: &#8220;main&#8221;<\/p>\n<p># On MAIN you typically allow redirects from anywhere, so this list can stay empty<br \/>\nallowed-origins: []<br \/>\n&#8220;`<\/p>\n<p>You only need to care about `origin-id` and `allowed-origins` if you want to restrict which servers are allowed to redirect **into** another server (see the dest config section).<\/p>\n<p>### 2.3. Generate the send-hash<\/p>\n<p>On the **main** server, in-game as an OP or from the console:<\/p>\n<p>&#8220;`text<br \/>\n\/redirect gen-hash<br \/>\n&#8220;`<\/p>\n<p>This will:<br \/>\n&#8211; Generate a random hex hash.<br \/>\n&#8211; Save it into `send-hash` in `config.yml`.<br \/>\n&#8211; Print the value in chat \/ console.<\/p>\n<p>Copy this value; you will paste it into the **dest** server `receive-hash`.<\/p>\n<\/details>\n<p>&#8212;<\/p>\n<details>\n<summary><strong>3. Configure the destination server<\/strong><\/summary>\n<p>This is the server that players are redirected TO.<\/p>\n<p>### 3.1. Enable transfers in server.properties<\/p>\n<p>Edit `server.properties` on the **dest** server:<\/p>\n<p>&#8220;`properties<br \/>\naccepts-transfers=true<br \/>\n&#8220;`<\/p>\n<p>Then **fully restart** the dest server.<\/p>\n<p>### 3.2. Basic config.yml<\/p>\n<p>Edit `plugins\/SecureRedirect\/config.yml` on the **dest** server:<\/p>\n<p>&#8220;`yaml<br \/>\n# target-host\/target-port are only needed if DEST will redirect players onward.<br \/>\n# For a simple two-server setup you can leave them as defaults.<br \/>\ntarget-host: &#8220;127.0.0.1&#8221;<br \/>\n# Optional. If omitted or invalid, defaults to 25565.<br \/>\n# target-port: 25565<\/p>\n<p># Optional on DEST unless you want it to send players further.<br \/>\nsend-hash: &#8220;&#8221;<\/p>\n<p># IMPORTANT: must match MAIN&#8217;s send-hash<br \/>\nreceive-hash: &#8220;<paste value from \/redirect gen-hash on MAIN>&#8221;<\/p>\n<p># Identifier this server uses when redirecting players<br \/>\norigin-id: &#8220;dest&#8221;<\/p>\n<p># Which origin servers are allowed to redirect into DEST.<br \/>\n# Make sure this list contains MAIN&#8217;s origin-id.<br \/>\nallowed-origins:<br \/>\n  &#8211; &#8220;main&#8221;<\/p>\n<p># Block direct joins; only transfers are allowed<br \/>\nrequire-transfer: true<\/p>\n<p>kick-no-transfer-message: &#8220;You must join this server via secure redirect.&#8221;<\/p>\n<p>kick-bad-hash-message: &#8220;Invalid or missing redirect token.&#8221;<br \/>\n&#8220;`<\/p>\n<p>### 3.3. Restart after editing<\/p>\n<p>After changing `config.yml` on DEST, **restart the server** (or at least reload the plugin) so the new values are applied.<\/p>\n<\/details>\n<p>&#8212;<\/p>\n<details>\n<summary><strong>4. Using the plugin<\/strong><\/summary>\n<p>### 4.1. Redirect yourself<\/p>\n<p>On the **main** server, as a player with permission:<\/p>\n<p>&#8220;`text<br \/>\n\/redirect<br \/>\n&#8220;`<\/p>\n<p>This will:<br \/>\n&#8211; Attach a cookie to you containing `<origin-id>:<send-hash>` from MAIN.<br \/>\n&#8211; Use Mojang&#8217;s transfer packet to move you to `target-host:target-port`.<\/p>\n<p>### 4.2. Redirect another player<\/p>\n<p>&#8220;`text<br \/>\n\/redirect <player>\n&#8220;`<\/p>\n<p>Permissions:<br \/>\n&#8211; `secureredirect.redirect` \u2013 use `\/redirect` on yourself.<br \/>\n&#8211; `secureredirect.redirect.others` \u2013 use `\/redirect <player>`.<br \/>\n&#8211; `secureredirect.genhash` \u2013 use `\/redirect gen-hash`.<\/p>\n<p>### 4.3. Rotating the token<\/p>\n<p>Any time you want to change the secret token:<\/p>\n<p>1. On MAIN, run:<br \/>\n   &#8220;`text<br \/>\n   \/redirect gen-hash<br \/>\n   &#8220;`<br \/>\n2. Copy the new `send-hash` value.<br \/>\n3. On DEST, update `receive-hash` in `config.yml` to this new value.<br \/>\n4. Restart DEST so it reads the new config.<\/p>\n<\/details>\n<p>&#8212;<\/p>\n<details>\n<summary><strong>5. Advanced: origin-id and allowed-origins<\/strong><\/summary>\n<p>The plugin encodes the redirect token as:<\/p>\n<p>&#8220;`text<br \/>\n<origin-id>:<send-hash><br \/>\n&#8220;`<\/p>\n<p>On DEST, when a player joins via transfer, the plugin:<\/p>\n<p>1. Verifies `player.isTransferred()`.<br \/>\n2. Reads and parses the cookie into `origin-id` and `hash`.<br \/>\n3. Checks that `hash` matches `receive-hash`.<br \/>\n4. If `allowed-origins` is **non-empty**, checks that `origin-id` is listed there.<\/p>\n<p>This lets you restrict which servers are allowed to redirect into DEST.<\/p>\n<p>**Example multi-origin setup:**<\/p>\n<p>&#8211; MAIN server:<br \/>\n  &#8220;`yaml<br \/>\n  origin-id: &#8220;main&#8221;<br \/>\n  allowed-origins: []<br \/>\n  &#8220;`<\/p>\n<p>&#8211; LOBBY server:<br \/>\n  &#8220;`yaml<br \/>\n  origin-id: &#8220;lobby&#8221;<br \/>\n  allowed-origins: []<br \/>\n  &#8220;`<\/p>\n<p>&#8211; DEST server:<br \/>\n  &#8220;`yaml<br \/>\n  origin-id: &#8220;dest&#8221;<br \/>\n  allowed-origins:<br \/>\n    &#8211; &#8220;main&#8221;<br \/>\n    &#8211; &#8220;lobby&#8221;<br \/>\n  &#8220;`<\/p>\n<p>Now only `main` and `lobby` can send players into `dest` (provided their hashes also match `receive-hash`).<\/p>\n<\/details>\n<p>&#8212;<\/p>\n<details>\n<summary><strong>6. Troubleshooting<\/strong><\/summary>\n<p>### 6.1. Stuck on &#8220;Transferring to a new server&#8230;&#8221;<\/p>\n<p>If the client never finishes transferring and no errors appear in the console:<\/p>\n<p>&#8211; Check on the **DEST** server:<br \/>\n  &#8211; `accepts-transfers=true` is set in `server.properties`.<br \/>\n  &#8211; The server is actually Paper 1.21.x (not Spigot or a proxy binary).<br \/>\n&#8211; Check on the **MAIN** server:<br \/>\n  &#8211; `target-host` and `target-port` point to the correct DEST address.<br \/>\n&#8211; Watch the DEST console while running `\/redirect`:<br \/>\n  &#8211; If no login\/join messages appear, the client is not reaching that server (host\/port\/host limitations).<\/p>\n<p>### 6.2. Direct join still works on DEST<\/p>\n<p>&#8211; Ensure on DEST `config.yml`:<br \/>\n  &#8220;`yaml<br \/>\n  require-transfer: true<br \/>\n  &#8220;`<br \/>\n&#8211; Restart DEST after changing the config.<br \/>\n&#8211; Make sure `SecureRedirect` is listed as enabled in `\/plugins`.<\/p>\n<p>### 6.3. &#8220;Invalid or missing redirect token&#8221;<\/p>\n<p>&#8211; Confirm that on DEST:<br \/>\n  &#8211; `receive-hash` exactly matches MAIN&#8217;s `send-hash`.<br \/>\n&#8211; Confirm that on DEST:<br \/>\n  &#8211; `allowed-origins` contains MAIN&#8217;s `origin-id` (or is empty to allow any).<\/p>\n<\/details>\n","protected":false},"excerpt":{"rendered":"<p>Hashed server redirect service.<\/p>\n","protected":false},"featured_media":136871,"template":"","meta":{"_minecraft_slug":"secureredirect","_minecraft_project_id":"Lgh8pQkA","_minecraft_author":"codingsushi","_minecraft_license":"Apache-2.0","_minecraft_downloads":47,"_minecraft_follows":0,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"secureredirect.zip","_minecraft_size_bytes":20741,"_minecraft_version_count":3,"_minecraft_updated_at":"2026-05-15T21:25:08.129199Z","_minecraft_date_created":"2026-01-24T19:07:50.507466Z","_minecraft_date_modified":"2026-01-27T15:06:06.147357Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/secureredirect","_minecraft_icon_attachment_id":136871,"_minecraft_imported_at":"2026-06-08T02:05:35+00:00","_minecraft_import_hash":"241ebe87e10b49a9d4c637deec016e4d","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,127],"mod_loader":[130,132],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82],"class_list":["post-136870","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-paper","mod_loader-bukkit","mod_loader-paper","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SecureRedirect - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SecureRedirect - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Hashed server redirect service.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/\",\"name\":\"SecureRedirect - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/secureredirect-icon-720be634a413f2476f78ee9f26f70bbf56604398_96.webp\",\"datePublished\":\"2026-06-08T02:05:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/secureredirect-icon-720be634a413f2476f78ee9f26f70bbf56604398_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/secureredirect-icon-720be634a413f2476f78ee9f26f70bbf56604398_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/secureredirect\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"SecureRedirect\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SecureRedirect - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/","og_locale":"en_US","og_type":"article","og_title":"SecureRedirect - Minecraft","og_description":"Hashed server redirect service.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/","name":"SecureRedirect - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/secureredirect-icon-720be634a413f2476f78ee9f26f70bbf56604398_96.webp","datePublished":"2026-06-08T02:05:35+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/secureredirect-icon-720be634a413f2476f78ee9f26f70bbf56604398_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/secureredirect-icon-720be634a413f2476f78ee9f26f70bbf56604398_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/secureredirect\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"SecureRedirect"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/136870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/136871"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=136870"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=136870"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=136870"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=136870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}