# Fix Nuxt “Blocked request. This host is not allowed”

> nuxt dev runs on Vite and blocks tunnel hostnames. Add .qurl.site or your tunnel’s domain under vite.server.allowedHosts in nuxt.config.ts.

Source: https://layerv.ai/guides/fix-nuxt-blocked-request-allowed-hosts/

---

[← All guides](https://layerv.ai/guides/) 

# Fix Nuxt “Blocked request. This host is not allowed”

Content updated October 25, 2026.

## Why does nuxt dev say “Blocked request. This host is not allowed” when I open my app through a tunnel?

Nuxt’s Vite-based dev server blocks unknown hosts. Add the tunnel domain, such as .qurl.site, to vite.server.allowedHosts in nuxt.config.ts. Nuxt has no top-level allowedHosts option. Avoid nuxt dev --public, which disables the check. With qURL™, share the running Nuxt app through single-use links with no public URL. If you later need one permanent public hostname, ngrok’s dev domain fits.

## What you need

- A Nuxt app running with nuxt dev, opened through a tunnel or qURL link
- Your nuxt.config.ts

## Steps

1. ### Read the host from the error  
Once the app has built, the page answers 403 with Vite’s message, which names vite.config.js even in a Nuxt project. While Nuxt is still building, its loading page answers instead: “Forbidden: this host is not allowed. Pass it to --host, or --public to allow any host.”
2. ### Add the tool’s domain under vite.server.allowedHosts  
nuxt.config.ts passes its vite key straight to Vite. A leading dot allows the domain and every subdomain: .qurl.site for qURL, your exact dev domain for ngrok, .trycloudflare.com for a Cloudflare Quick Tunnel. Nuxt applies the change without a restart.  
```  
// nuxt.config.ts (merge into your existing config)
export default defineNuxtConfig({
  vite: { server: { allowedHosts: ['.qurl.site'] } },
})
```
3. ### Share it through qURL  
Restart nuxt dev with --host 127.0.0.1, then publish that loopback address from a second terminal as shown. Your app stays on this computer; nothing listens on your network. Each qurl share link opens once and expires within 24 hours.  
```  
qurl publish http://127.0.0.1:3000
qurl share <CRID>
```

## What the recipient sees

With the domain allowed, the app loads through the link and hot reload connects.

## Which tool should carry your nuxt dev server?

| Option                                                                                  | Choose it when                                                                                                                            | Trade-off                                                                                                                   |
| --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| [qURL](https://layerv.ai/cli/)                                                          | qURL fits when particular people should try the Nuxt app: one .qurl.site entry under vite.server covers every qURL link, with no account. | Publish the address your dev server listens on, and create a separate qURL link for each person with qurl share.            |
| [ngrok](https://layerv.ai/compare/qurl-vs-ngrok/)                                       | ngrok fits when you want one stable URL: your ngrok dev domain stays the same, so one exact allowedHosts entry lasts.                     | ngrok needs an account and authtoken, the URL is public, and free-plan browser visitors see a warning page first.           |
| [Cloudflare Quick Tunnels](https://layerv.ai/compare/qurl-vs-cloudflare-quick-tunnels/) | A Cloudflare Quick Tunnel fits a no-account look: .trycloudflare.com covers the hostname that changes every run.                          | A Cloudflare Quick Tunnel URL is public unless you set --allowed-mail, and Quick Tunnels do not support Server-Sent Events. |

## Troubleshooting

| If you see                                                                                                             | Do this                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| “Forbidden: this host is not allowed” while the app is still building                                                  | That is Nuxt’s loading page, before Vite takes over. Wait for the build to finish and reload; if Vite then answers “Blocked request”, add the domain as above. Don’t reach for --public: it turns the host check off.                                                                                                                                                                                                                                         |
| qurl publish says the local app is not accepting TCP connections                                                       | Start the app first and check that curl works on the same address. qurl publish connects to localhost as 127.0.0.1, so if your app listens only on IPv6 (on macOS or Linux, lsof -iTCP -sTCP:LISTEN -nP shows \[::1\]), publish 'http://\[::1\]:PORT' instead, or start the dev server with --host 127.0.0.1 and publish that address. Neither requires listening on your LAN. Keep the quotes: zsh treats the brackets as a pattern.                         |
| The recipient sees “Access link invalid”                                                                               | The link was already used or has expired. Run qurl share again and send the new link.                                                                                                                                                                                                                                                                                                                                                                         |
| The recipient sees “Resource not found”                                                                                | The resource was deleted after the link was made. Publish the app again, then run qurl share and send the new link.                                                                                                                                                                                                                                                                                                                                           |
| publish rejects http://127.0.0.1 with “only HTTPS URLs are allowed”, or asks you to log in                             | You have a CLI older than 3.0\. On macOS run brew update, then brew upgrade qurl; elsewhere install the latest release again. After updating, qurl --version should print 3.4.1 or later.                                                                                                                                                                                                                                                                     |
| publish prints no Access: line, or the Access: line says public and you did not ask for public                         | With no Access: line, the CLI is older than 3.4.1: on macOS run brew update, then brew upgrade qurl; elsewhere install the latest release again. A resource that an older CLI published is public unless you published it with --private, and anyone who has the CRID of a public resource can open it. To make a public resource private, run qurl delete <CRID> and publish again with qurl 3.4.1 or later. The new resource is private and has a new CRID. |
| publish says this Linux session “can’t reach a systemd user manager”                                                   | You are in a container or sandbox without a user service manager. Run qurl publish with --foreground; sharing lasts as long as that process runs.                                                                                                                                                                                                                                                                                                             |
| publish says “Quota Exceeded” with “protected resource limit reached”, or “Your qURL account has reached a plan limit” | You can see this without an account: a device with no account can keep up to 3 active resources, with links that last up to 24 hours. Run qurl list --status active, then qurl delete <CRID> for any you no longer need (it asks you to confirm; --yes skips that). qurl stop keeps the resource, so it does not free a slot.                                                                                                                                 |

## Frequently Asked Questions

Why not use nuxt dev --public? 

In the @nuxt/cli source, --public sets Vite’s allowedHosts to true and allows any origin, which turns the host check off. Vite’s docs warn that this lets any website reach your dev server through DNS rebinding. List the domains you need instead.

Does Nuxt have its own allowedHosts option? 

No. Its devServer options cover https, port, host, url, the loading template and CORS, not allowed hosts. The vite key in nuxt.config.ts is the place.

Who else can reach my app while the link is open? 

Opening the link admits the network address it was opened from for the session, which lasts 1 hour by default. Other devices that share that public IP address, such as people on the same office or café network or VPN, can reach the app until the session ends. By default a link admits whoever opens it; access rules set through the API, such as IP allow and deny lists, can restrict that. Keep your app’s own sign-in for anything sensitive.

## Related Resources

[Guide: Allow a tunnel’s hostname in your dev server →](https://layerv.ai/guides/allow-tunnel-hostname-in-dev-server/) [Guide: Fix Vite “Blocked request” →](https://layerv.ai/guides/fix-vite-blocked-request-host-not-allowed/) [Nuxt docs: nuxt dev ↗](https://nuxt.com/docs/4.x/api/commands/dev) [Nuxt docs: vite option ↗](https://nuxt.com/docs/4.x/api/nuxt-config#vite)

## Publish your app now

Install the CLI, then run one command. No sign-up, no API key.

[Install the CLI ↗](https://layerv.ai/cli/)



---

*This markdown version is auto-generated from [https://layerv.ai/guides/fix-nuxt-blocked-request-allowed-hosts/](https://layerv.ai/guides/fix-nuxt-blocked-request-allowed-hosts/) for AI agents. Curated agent resources: [llms.txt](https://layerv.ai/llms.txt). For the full interactive experience, visit the HTML version.*

