
Separate browser permission failures from CORS, HTTPS, and application errors
Chrome can treat requests to localhost and private-network addresses differently from requests to public HTTPS origins. That distinction can make a previously routine development workflow fail because of browser permissions, secure-context rules, preflight behavior, mixed content, or ordinary application configuration. In this guide, we build a controlled test matrix that compares direct local access with a public HTTPS URL backed by a Localtonet HTTP tunnel. The goal is diagnosis, not bypassing browser or organizational security controls.
📋 What's in this guide
Why direct local requests and tunnel requests behave differently
A browser request can reach the same application through two materially different network paths. In the direct path, Chrome connects to a loopback name such as localhost, a loopback IP address, or an address on the local private network. In the tunnel path, Chrome connects to a public HTTPS origin. The Localtonet relay then carries that traffic through the outbound connection established by the Localtonet client and forwards it to the application running on or reachable from the client device.
The application behind both paths may be identical, but the browser-facing destination is not. Chrome makes security decisions using details such as the initiating page's origin, the destination origin, the security context, the requested method and headers, and whether the destination is considered local or private from the browser's perspective. Changing the destination from a private address to a public HTTPS URL can therefore change which browser checks apply before the request reaches the application.
This makes an HTTP tunnel useful as a diagnostic control. If a request fails when a page calls a LAN address directly but succeeds when the same application is reached through a Localtonet public HTTPS address, the comparison points toward a browser-facing network boundary. It does not prove that one specific Chrome feature is responsible. You must still inspect the console, request details, preflight traffic, response headers, and server logs to distinguish Local Network Access behavior from CORS, mixed content, DNS, authentication, and application failures.
Local Network Access behavior, permission prompts, enterprise controls, diagnostics, and rollout status can change between Chrome releases. Confirm current implementation details in Chrome Platform Status and test the exact stable, beta, or managed browser version used by your audience. This guide deliberately avoids hardcoding a rollout milestone.
Understand the four boundaries before testing

Several independent browser protections can produce similar symptoms. A useful test keeps them conceptually separate. Otherwise, a CORS rejection may be mislabeled as a local-network permission issue, or a mixed-content block may be mistaken for a tunnel failure.
Origin boundaries
A web origin is generally defined by its scheme, host, and port. Two URLs are cross-origin if one of those components differs. A page loaded from a public HTTPS site and an API reached through a different public HTTPS hostname are still separate origins. Moving the API behind a public tunnel does not automatically make it same-origin with the calling page.
The same rule applies during local development. A page and API can both run on the same computer yet still be cross-origin because they use different ports, hostnames, or schemes. Conversely, a reverse proxy can present multiple backend services through one browser-facing origin. Record complete URLs in your test notes rather than labeling them only as “local” or “remote.”
Local Network Access controls
Chrome's Local Network Access work addresses requests from web content to destinations associated with the user's local environment. Depending on the Chrome version and configuration, browser enforcement may involve permission behavior or request restrictions. The exact user interface and enforcement state should be verified against the current browser release rather than assumed from an older article or screenshot.
These controls are not the same as CORS. Local-network checks concern the relationship between the browser context and the destination's network location. CORS concerns whether script running at one origin is permitted to read a response from another origin. A request can encounter both categories of checks.
Secure contexts and mixed content
An HTTPS page attempting to use an insecure HTTP endpoint can run into mixed-content rules before the application handles the request. Loopback origins may receive special treatment in some web-platform contexts, but developers should not generalize that treatment to arbitrary LAN addresses or assume that it remains identical across browser versions.
A Localtonet HTTP tunnel provides a public HTTPS address for the configured local HTTP service. This changes the browser-facing scheme and destination. It does not modify the local application itself, and it does not guarantee that every browser request will succeed. Cross-origin policy, authentication, application routing, cookies, and response headers can still affect the result.
CORS and preflight requests
For a cross-origin request, Chrome may send an OPTIONS preflight before the intended request. Whether a preflight is required depends on the request method, headers, and content type. If the server does not handle the preflight correctly, the browser can block the scripted request even though navigating directly to the endpoint works.
A tunnel does not remove CORS. When JavaScript calls the public tunnel URL from another origin, the application still needs an appropriate cross-origin policy. The browser evaluates the response as coming from the tunnel's public origin. If credentials are involved, wildcard policies and credentialed-request rules require particular care.
| Boundary | Typical evidence | What changing to a tunnel may change |
|---|---|---|
| Local Network Access | A permission-related message or local/private destination restriction in Chrome | The browser now addresses a public HTTPS endpoint instead of the private target directly |
| Mixed content | An HTTPS page attempts to call an insecure HTTP URL and Chrome blocks it | The browser-facing tunnel endpoint uses HTTPS |
| CORS | Console policy errors, failed preflight, or missing response headers | The destination origin changes, but cross-origin enforcement still applies |
| Application routing | HTTP 404, 405, redirect loops, rejected host, or unexpected application response | The host and scheme visible to the application or framework may differ |
| Connectivity | Connection refusal, timeout, DNS failure, or no application log entry | The browser uses the public relay path while the client must still reach the local service |
| Authentication | HTTP 401 or 403, login redirect, missing cookie, or rejected token | The new origin can affect cookie scope and credential behavior |
Prepare a controlled Chrome test environment
Start with a small endpoint whose behavior you understand. A health route returning a short response is better than a complex application page because it reduces unrelated variables. The service must listen on a local IP address and port reachable from the device running the Localtonet client. Do not copy a sample port from an unrelated tutorial. Use the actual port on which your application is listening.
You also need a Chrome version representative of the environment you are investigating. Record whether it is stable, beta, development, or managed by an organization. Browser policy can affect permissions and network access, so a managed workstation may behave differently from a personal test machine.
Prepare the following before running the matrix:
- The exact local service URL, including scheme, hostname or IP address, port, and path.
- A simple endpoint that can be requested safely without changing data.
- Access to the application's request logs or equivalent diagnostics.
- Chrome DevTools, with the Console and Network panels available.
- The Localtonet client installed on a device that can reach the service.
- A device-specific Localtonet authentication token selected through the normal account workflow.
- An available Localtonet relay server or region selected from the current dashboard.
- A separate calling page if the workflow specifically involves JavaScript making a cross-origin request.
A public tunnel makes the configured service reachable through its assigned public address while the selected client is connected and the tunnel is running. Begin with a dedicated development instance and a read-only test route. Do not expose an unauthenticated administration panel, production database interface, internal control plane, or any service that was designed only for trusted local users.
Record the variables you will hold constant
For a meaningful comparison, keep the method, request body, custom headers, credentials mode, and application route the same. Change only the destination URL first. If you change the endpoint, authentication, browser profile, and request headers at the same time, the result will not isolate the local-network boundary.
Browser navigation and JavaScript fetches are not equivalent tests. A URL can load successfully in a tab while a script from another origin cannot read it. Plan to test both when the real workflow includes frontend code.
Establish the direct local baseline
Test the application locally before introducing Localtonet. This confirms that the service is running and gives you a known response to compare with the tunnel result.
Verify the service outside the browser workflow
Use the application's own health check, a trusted local HTTP client, or a direct browser navigation to confirm that the endpoint answers on the expected local address and port. Record the status code, response body, and any relevant response headers. If the service does not work directly on its host, creating a tunnel will not repair it.
Pay attention to which interface the service uses. An application bound only to a specific interface may be reachable through one hostname but not another. The Localtonet client must be able to connect to the exact local target configured for the tunnel.
Test direct navigation
Open the local URL directly in Chrome. Keep DevTools open and preserve the network log if redirects are expected. Direct navigation answers a narrow question: can Chrome navigate to the endpoint from this device? It does not by itself prove that a public page can call the same endpoint through JavaScript.
Test the real calling context
Next, load the page that normally initiates the request and reproduce the operation. If the initiating site is public HTTPS and the destination is localhost or a private-network address, this is the test most likely to expose the browser-facing boundary discussed in this guide.
You can use a minimal request pattern in your own test page, replacing the placeholder with your actual endpoint:
const targetUrl = "LOCAL_SERVICE_URL";
fetch(targetUrl, {
method: "GET"
})
.then(async response => {
console.log("Status:", response.status);
console.log("Body:", await response.text());
})
.catch(error => {
console.error("Request failed:", error);
});
Do not add custom headers merely to make the test look realistic. Custom headers can trigger a preflight and introduce another variable. Begin with the simplest request that represents useful application behavior, then add methods, headers, request bodies, and credentials one at a time.
Capture baseline evidence
Record whether Chrome displayed a permission prompt, whether the request appeared in the Network panel, whether an OPTIONS request occurred, and whether the application logged either the preflight or intended request. Also capture the exact console message. The same visible symptom, such as a failed button action, can correspond to very different network evidence.
Create the public HTTPS comparison path with Localtonet
With Localtonet, the client application on the device establishes an outbound connection to one of our relay servers. An HTTP tunnel points to a local IP address and port on, or reachable from, that client device. The resulting public HTTPS address becomes the browser-facing endpoint.
This workflow does not require inbound router port forwarding, firewall changes, VPN setup, or a public IP address. It also does not convert the application into a public service permanently. The endpoint is available only while the selected Localtonet client is connected and the tunnel is running.
Install and run the Localtonet client
Install the Localtonet client on the device that can reach the local HTTP service. Run the client and confirm that the device is connected before testing the tunnel.
Authenticate or select the client device
Use the device-specific authentication token associated with the client that will run the tunnel. Treat this token as a credential. Do not paste it into source code, screenshots, issue reports, or browser-side JavaScript.
Select an available relay server
Choose a current server or region from the Localtonet dashboard. Available values can vary, so obtain the selection from the current product instead of copying a server code from an old tutorial.
Create an HTTP tunnel to the local target
Configure the HTTP tunnel with the local IP address and port used by the verified service. HTTP tunnels can use Random Sub Domain, Custom Sub Domain, or Custom Domain process types. For a controlled diagnostic test, use an option currently available to your account and avoid changing DNS unless custom-domain behavior is part of the test.
Start the tunnel
Creating a tunnel does not start it. Press the Start button and wait until the selected client and tunnel are running. Copy the assigned public HTTPS URL without exposing any private credentials.
Use the public URL, then stop or delete the tunnel
Replace only the destination in your browser test with the assigned HTTPS URL and preserve the same path where applicable. When testing is complete, stop the tunnel. Delete it as well if the configuration is no longer required.
For the maintained product workflow, consult our Localtonet documentation. Exact dashboard availability, server choices, plan-specific options, and domain requirements can change, so the current dashboard remains authoritative for those selections.
Your application continues listening on its local address and port. Chrome sends the comparison request to the public HTTPS URL, our relay carries it over the client's outbound connection, and the client forwards it to the configured local target. Application-level CORS, authentication, routing, and authorization remain your responsibility.
Run a test matrix that isolates the failure

A useful matrix starts simple and adds complexity gradually. Use a fresh Network recording for each case, label the result, and note which requests reached the application. Avoid treating one successful navigation as proof that every JavaScript workflow will work.
| Test | Browser-facing destination | What it helps establish |
|---|---|---|
| Direct local navigation | Localhost, loopback, or private address | Whether Chrome can navigate directly to the running service |
| Direct scripted request | Localhost, loopback, or private address | Whether the real initiating origin encounters local-network, mixed-content, or CORS enforcement |
| Tunnel navigation | Localtonet public HTTPS URL | Whether the tunnel is running and the public route reaches the application |
| Tunnel scripted request | Localtonet public HTTPS URL | Whether the frontend can call the public origin under the application's CORS and authentication rules |
| Tunnel request with real method and headers | Localtonet public HTTPS URL | Whether preflight handling and application policy support the production-like request |
| Repeat in target Chrome environment | Both paths | Whether browser channel, profile, or managed policy changes the outcome |
Interpret common result patterns
If direct navigation and tunnel navigation both fail, inspect the local service first. The process may not be running, the route may be wrong, or the configured local target may be unreachable from the Localtonet client.
If direct navigation works but the direct scripted request fails, inspect the initiating page's scheme and origin, Chrome's permission or local-network diagnostics, mixed-content messages, and CORS evidence. Successful navigation does not grant a different origin permission to read the response.
If the direct scripted request fails but the tunnel scripted request succeeds, the change in browser-facing destination is relevant. The result is consistent with a local-network or insecure-destination boundary, but confirm the exact cause from DevTools rather than inferring it solely from success through the tunnel.
If tunnel navigation works but the tunnel scripted request fails, the Localtonet route is probably reaching the application. Focus next on CORS, preflight handling, credentials, cookies, authorization, and frontend configuration.
If the tunnel request reaches the application but produces a different route or redirect behavior, inspect assumptions about hostnames, schemes, callback URLs, and trusted hosts. Do not weaken global host or origin validation merely to make a test pass. Add only the specific public origin needed for the controlled test, using the framework's documented configuration.
Use Chrome DevTools to identify the failing layer

Open DevTools before reproducing the request. Enable preservation of the Network log when redirects or page navigation would otherwise clear useful evidence. Filter by the endpoint path and inspect both the intended request and any preceding OPTIONS request.
Start with the Console
Console messages often identify whether Chrome blocked mixed content, rejected a cross-origin response, encountered a permission issue, or failed at the network layer. Copy the complete message into your test notes. Do not reduce every browser-generated “blocked” message to CORS, because Chrome uses different enforcement systems.
Inspect the Network panel
Determine whether the intended request exists. If it does, record the request URL, method, status, initiator, request headers, and response headers. If an OPTIONS request appears first, inspect it independently. A failed preflight can prevent the intended request from ever being sent.
When no request appears, the browser may have stopped the operation before ordinary network dispatch, or the application code may not have initiated it. Check the Console and add temporary logging immediately before the request in the calling code.
Correlate browser evidence with application logs
Browser and server observations should agree. If Chrome reports a failed request but the server logs a successful response, a browser policy may be preventing script from reading that response. If the server has no request entry, look earlier in the chain: browser enforcement, DNS, connection establishment, tunnel status, or preflight failure.
For the tunnel path, verify three separate states:
- The selected Localtonet client is connected.
- The HTTP tunnel has been started and is running.
- The local application receives the forwarded request.
A tunnel configuration can exist without being active. That lifecycle distinction is important when a previously working public URL stops responding after a device restart or client disconnect.
Keep preflight and intended requests separate
An OPTIONS response must satisfy the browser's policy for the intended method and requested headers. A successful status alone is not always enough. Inspect the relevant cross-origin response headers and confirm that they match the actual initiating origin and request shape.
Avoid solving a narrow development problem by returning an unrestricted cross-origin policy everywhere. Configure only the origins, methods, headers, and credential behavior the application needs. If the application framework offers a documented CORS component, use it rather than creating inconsistent headers in multiple routes.
Expose the test service with least privilege
A public HTTPS tunnel is useful for remote browsers, mobile devices, webhooks, and compatibility testing, but it changes who can potentially reach the service. Treat the assigned address as public, even if it is shared only with a small test group.
A tunnel should not be used to bypass organizational authorization, browser policy, network policy, or security review. If a managed Chrome environment intentionally restricts local-network access, involve the responsible administrator. Use the tunnel only when public HTTPS access is an approved architecture for the service and test.
Review how the application handles cookies and credentials at the public origin. Cookies scoped to localhost will not automatically belong to the tunnel hostname. Secure and same-site cookie behavior can also differ when the calling origin changes. Diagnose those differences explicitly rather than disabling browser protections.
Never place a Localtonet device token in frontend code. The browser only needs the assigned public service URL. The Localtonet client and account workflow handle the device identity used to run the tunnel.
Troubleshooting checklist
The public HTTPS URL does not load
First confirm that the local application still works on the configured target. Then confirm that the Localtonet client is connected and the tunnel has been started. Creating the tunnel record is not enough. Verify that the local IP address and port match the service that you tested directly.
If the client is running on another device, confirm that device can reach the target over the relevant network path. Do not assume that a service reachable from your workstation is also reachable from the machine running the Localtonet client.
The tunnel opens in a tab, but fetch still fails
This pattern usually directs attention toward browser policy rather than basic reachability. Look for an OPTIONS request and inspect the Console for a CORS message. Confirm that the application permits the exact initiating origin. The local URL and public tunnel URL are different origins, so a policy written only for the local development origin may need an explicit, narrow update.
The preflight succeeds, but the real request fails
Compare the intended request with the preflight declaration. Check application authorization, route support, request body parsing, and server logs. A preflight only determines whether the browser may attempt the request. It does not guarantee that the application's business logic will accept it.
The response is a redirect or unexpected HTML
Inspect the redirect chain and final URL. Authentication middleware may be redirecting API calls to a login page, or the application may be generating URLs based on assumptions about the original scheme and hostname. Fix the application's documented proxy or public-origin configuration rather than hardcoding a workaround into the browser test.
The request works without credentials but fails with them
Credentialed cross-origin requests involve additional CORS and cookie constraints. Verify that the frontend intentionally requests credentials, the server intentionally allows them for the exact origin, and the cookie attributes fit the public HTTPS context. Do not use a wildcard origin as a shortcut for a credentialed workflow.
The direct local test differs across Chrome installations
Compare browser versions, release channels, profiles, extensions, site permissions, and enterprise management. Because Local Network Access behavior evolves, a test result from one Chrome release should not be generalized to every user. Reproduce the matrix in the browser environment that matters for the deployment.
The browser reports a local-network issue even though CORS is configured
CORS configuration does not necessarily grant local-network permission. Treat the two boundaries separately. Capture the exact Chrome message, verify current Chrome Platform Status information, and check whether the initiating context meets current secure-context and permission requirements.
The tunnel test succeeds, but production architecture should remain private
Treat the tunnel result as diagnostic evidence, not an automatic architecture decision. You may decide to keep the service private and redesign the calling flow so that a trusted backend communicates with it, or use an approved private networking approach. Localtonet also provides VPN Manager for private mesh networking, but standard HTTP tunneling itself is not a VPN.
Frequently asked questions
Does a Localtonet HTTP tunnel disable Chrome Local Network Access checks?
No. The tunnel does not disable browser security controls. It gives the browser a public HTTPS destination, so the browser-facing request no longer directly targets the configured localhost or private-network address. Chrome can still enforce CORS, authentication, cookie, content-security, and other applicable rules.
If the tunnel URL works, does that prove Local Network Access caused the direct failure?
Not by itself. The public URL also changes the destination scheme, hostname, origin, DNS path, and network route. Use Chrome DevTools and application logs to determine whether the direct failure came from a local-network permission, mixed content, CORS, DNS, connectivity, or application behavior.
Does using a public HTTPS tunnel eliminate CORS?
No. If the calling page and tunnel URL have different origins, Chrome still applies cross-origin rules. Your application must return an appropriate policy for the specific origin, methods, headers, and credential behavior required by the workflow.
Why does the endpoint work when opened directly but fail from JavaScript?
Top-level navigation and a scripted cross-origin request are different browser operations. JavaScript may encounter CORS, preflight, credentials, mixed-content, or local-network restrictions that do not appear in the same way during direct navigation. Inspect the Network and Console panels for the scripted request.
Must I open an inbound router port for the test?
No. The Localtonet client establishes an outbound connection to our relay server, so the normal tunneling workflow does not require inbound router port forwarding, firewall changes, VPN setup, or a public IP address.
Is the public endpoint permanent?
The endpoint is available only while the selected client device is connected and the tunnel is running. Creating a tunnel does not start it. Start it for the test, then stop or delete it when it is no longer required.
Should I use an HTTP tunnel or VPN Manager for this comparison?
Use an HTTP tunnel when the test specifically requires a public HTTPS origin backed by a local HTTP service. VPN Manager is our private mesh VPN capability and serves a different networking model. Standard HTTP tunneling should not be described as VPN access.
How should I account for future Chrome changes?
Record the exact Chrome version and management state used in every test. Confirm current Local Network Access implementation and rollout information in Chrome Platform Status, and rerun the matrix against the browser channels relevant to your users rather than relying on an old milestone or screenshot.
Test your local HTTP service through a public HTTPS path
Run the Localtonet client on the device that can reach your development service, create an HTTP tunnel, and compare the public HTTPS request with the direct local request. Keep DevTools and application logs open so the result identifies the failing layer instead of merely hiding the symptom.
Get Started Free →