Tutorial
12 min read
63 views

Expose vs ngrok : héberger soi-même un reverse proxy PHP pour Laravel

IT
InstaTunnel Team
Published by the InstaTunnel team | Editorial policy
Expose vs ngrok : héberger soi-même un reverse proxy PHP pour Laravel

Current comparison

Looking for the main ngrok alternative guide?

We keep the latest ngrok alternative comparison, CLI commands, pricing notes, and webhook examples on one canonical page.

Open the InstaTunnel ngrok alternative guide

Quick answer

Expose vs ngrok : Auto-hébergement d’un reverse proxy PHP pour Laravel: quick answer

If free tunnel limits interrupt your workflow, compare session length, stable URLs, concurrent tunnels, and paid-plan pricing before choosing a localhost tunnel tool.

What free tunnel limits should developers check first?

Check session duration, URL stability, concurrent tunnels, custom subdomains, bandwidth or request limits, and whether webhook callbacks survive restarts.

How does InstaTunnel handle longer development sessions?

InstaTunnel Free is designed around 24-hour sessions, with Pro available for higher limits and MCP endpoint tunnel workflows.

En tant que développeur PHP ou Laravel moderne, le développement local fonctionne comme une machine bien rodée. Vous utilisez probablement des outils comme Laravel Herd, Valet ou Sail pour servir vos applications sur un domaine .test. Mais que faire lorsque vous devez partager cet environnement local avec le monde extérieur — pour une démo à un client, tester des webhooks de Stripe ou GitHub, ou prévisualiser une mise en page responsive sur un vrai téléphone ? Il vous faut un tunnel.

Depuis plus d’une décennie, la réponse par défaut est ngrok. C’est robuste et compatible avec n’importe quelle stack, mais sa version gratuite comporte des limitations qui peuvent perturber votre workflow. Une alternative à connaître est Expose, un outil open-source, natif PHP, de tunneling développé par Marcel Pociot chez Beyond Code — l’équipe derrière Laravel Herd et Tinkerwell.

Ce guide compare ces deux outils tels qu’ils fonctionnent aujourd’hui, puis explique comment héberger votre propre serveur Expose sur un VPS économique.


La version gratuite de ngrok, décrite avec précision

ngrok a évolué d’un utilitaire de tunneling simple à une plateforme d’ingress complète. Son plan gratuit est plus généreux que ce que beaucoup de contenus de comparaison laissent entendre, mais il a des limites réelles, et certaines affirmations courantes à son sujet ne tiennent pas.

Ce qui est réellement limité sur le plan gratuit, selon la documentation actuelle de ngrok :

Ressource Limite du plan gratuit
Transfert de données sortant 1 Go/mois
Requêtes HTTP/S 20 000/mois
Endpoints en ligne Jusqu’à 3
Agents simultanés 3
Connexions TCP 5 000/mois
Taux de requêtes HTTP 4 000/min
Taux de connexions TCP 100/min
Domaines personnalisés/marque Non disponible en Gratuit (les Hobbyistes ont des domaines ngrok-branded ; le bring-your-own-domain est payant)

Deux points importants pour éviter la confusion :

  • Il n’y a pas de timeout de session sur le plan gratuit. La documentation de ngrok l’indique explicitement — les endpoints gratuits peuvent fonctionner indéfiniment en tant que service en arrière-plan. Pas besoin de redémarrer toutes les quelques heures.
  • Pas besoin d’obtenir un nouveau sous-domaine aléatoire à chaque connexion. Depuis 2023, chaque compte ngrok — y compris en version gratuite — peut réclamer un domaine statique gratuit (par exemple panda-new-kit.ngrok-free.app) qui vous appartient en permanence et ne change pas au redémarrage. Ce n’est pas un domaine personnalisé/marqué (c’est toujours payant), mais cela résout le problème du “je dois mettre à jour l’URL webhook Stripe à chaque redémarrage du tunnel”, tant que vous l’avez revendiqué. Sans revendication, vous obtenez toujours un nouveau sous-domaine aléatoire à chaque connexion.
  • Le trafic HTTP/S du plan gratuit affiche une page d’interstitiel “cliquez pour continuer” dans le navigateur, principalement pour dissuader l’abus de phishing. Cela n’affecte pas les requêtes programmatiques (comme un webhook POST de Stripe), et peut être contourné même en version gratuite en envoyant un User-Agent personnalisé ou l’en-tête ngrok-skip-browser-warning.

Au-delà du plan gratuit, les plans actuels sont Hobbyist (8–10$/mois selon la facturation annuelle ou mensuelle, domaines marqués ngrok, pas d’interstitiel), Pay-as-you-go (20$/mois de base + usage mesuré, endpoints illimités, bring-your-own-domain), et Enterprise (tarification sur devis, SSO/SCIM/conformité).


Expose : une alternative open-source native PHP

Expose ne partage que le trafic HTTP/HTTPS — ce n’est pas un transport TCP/UDP générique comme ngrok, donc il ne tunnel pas une connexion brute à une base de données ou une session SSH. En échange, il est étroitement intégré au workflow web et son cœur est entièrement open source (licence MIT) et écrit en PHP, donc si quelque chose casse, vous pouvez réellement lire le code qui tourne.

À l’heure actuelle, le projet est actif : le dépôt exposedev/expose compte environ 4 500+ étoiles et 300+ forks sur GitHub, avec sa dernière version (3.2.2) sortie en mars 2026. Le client exige PHP 8.2 ou plus récent — c’est une exigence forte dans le fichier composer.json, pas seulement une recommandation, donc les anciennes recommandations “PHP 7.4+” en ligne sont obsolètes.

Installation du client

Trois méthodes supportées :

Laravel Herd — si vous utilisez déjà Herd, Expose s’intègre avec ; il suffit de définir votre token dans les paramètres de Herd.

Archive PHP (PHAR) — la méthode principale documentée :

curl https://github.com/exposedev/expose/raw/master/builds/expose -L --output expose
chmod +x expose
sudo mv expose /usr/local/bin/expose

Via Composer :

composer global require exposedev/expose

(Note : le package était historiquement publié sous beyondcode/expose ; ce nom fonctionne toujours sur Packagist, mais la documentation actuelle utilise exposedev/expose). Assurez-vous que votre répertoire bin global de Composer est dans votre PATH.

Partager un site

expose token VOTRE_TOKEN

Ensuite, depuis un répertoire de projet .test (convention Herd/Valet), lancez simplement expose sans argument, ou partagez une URL explicite :

expose share http://localhost:8000

Un tableau de bord des requêtes locales à http://127.0.0.1:4040 vous permet d’inspecter et de rejouer les requêtes entrantes, similaire à l’inspecteur de ngrok.

Une correction à une affirmation courante : les sous-domaines personnalisés ne sont pas disponibles en version gratuite chez Expose. Passer --subdomain nécessite soit un compte Expose Pro/Team, soit votre propre serveur auto-hébergé :

expose share mon-site.test --subdomain=mon-site

Sur le serveur gratuit sharedwithexpose.com (hébergé par Beyond Code en Allemagne), chaque connexion reçoit un sous-domaine aléatoire et les connexions sont limitées dans le temps. C’est précisément ce point qui rend l’auto-hébergement intéressant si vous souhaitez des URLs stables et personnalisées sans payer par siège.

Tarification actuelle d’Expose (expose.dev)

Niveau Prix Inclus
Hobby Gratuit TLS/SSL, connexions limitées dans le temps, URLs aléatoires, un serveur EU
Pro 79$/utilisateur/an Pas de limite de temps, URLs persistantes, domaines et sous-domaines personnalisés, réseau mondial
Équipe 229$/équipe/an (jusqu’à 10 utilisateurs) Tout en Pro, support prioritaire

Intégration Laravel Valet et Herd

Laravel Valet (outil local maintenu par Taylor Otwell) supporte trois outils de partage en versions actuelles : ngrok, Expose, et cloudflared de Cloudflare — sélectionnés via valet share-tool ngrok|expose|cloudflared. Valet vous proposera d’installer celui que vous choisissez (Homebrew pour ngrok/cloudflared, Composer pour Expose) puis valet share l’utilise.

Laravel Herd — environnement local de Beyond Code — intègre Expose nativement, configurable directement depuis l’interface des paramètres de Herd, sans étape d’installation séparée.


Comparaison des fonctionnalités

ngrok (Gratuit/Hobbyist) Expose (Hobby/Pro)
Cas d’usage principal Ingress réseau générique ; API/K8s d’entreprise Environnements web locaux, HTTP/S uniquement
Langage Go, client/serveur propriétaire PHP, open source (MIT)
Protocoles HTTP/S, TCP, TLS HTTP/S uniquement
URL stable en plan gratuit Oui, si vous revendiquez votre domaine statique Non — sous-domaine aléatoire à chaque connexion
Sous-domaines personnalisés Payant uniquement Payant (Pro) ou gratuit via auto-hébergement
Inspecteur de requêtes Oui (localhost:4040-style dashboard) Oui
Auto-hébergement Non applicable (gestion uniquement) Oui, entièrement documenté et open source

Auto-hébergement d’Expose sur un VPS économique

Si vous êtes centré PHP/Laravel et souhaitez des sous-domaines stables et personnalisés sans frais annuel par siège, l’auto-hébergement est la vraie différence. Voici la procédure actuelle — notez qu’elle diffère de quelques guides plus anciens (y compris des brouillons antérieurs de ce document) : le serveur auto-hébergé est désormais un package séparé du client, avec son propre binaire et son propre dépôt.

Étape 1 : Provisionner le serveur et configurer DNS

Un droplet DigitalOcean basique coûte maintenant 4$/mois (512 MiB RAM, 1 vCPU partagé, 10 GiB SSD, 500 GiB transfert) — suffisant pour un serveur Expose personnel ou de petite équipe. Ubuntu 24.04 LTS est un choix solide.

Ajoutez deux enregistrements DNS A pointant vers l’IP de votre Droplet : - expose (ou tout sous-domaine que vous souhaitez comme base, par ex. expose.votredomaine.com) - *.expose (le wildcard, pour que chaque sous-domaine du tunnel soit résolu)

Étape 2 : Installer PHP et Composer

Le package serveur d’Expose requiert PHP 8.2+ :

sudo apt update
sudo apt install php-cli php-curl php-mbstring php-xml php-zip php-sqlite3 unzip git -y

curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Étape 3 : Installer le serveur Expose (pas le client)

Le serveur auto-hébergé vit dans son propre dépôt, exposedev/server, séparé du package client exposedev/expose. Clonez-le et installez ses dépendances :

git clone https://github.com/exposedev/server.git
cd server
composer install

Le cœur open-source du serveur vous fournit l’infrastructure de tunneling. Il n’inclut pas le tableau de bord Expose Pro pour la gestion d’équipe/facturation — cela concerne la plateforme gérée expose.dev.

Étape 4 : Démarrer le serveur

php expose-server serve expose.votredomaine.com

Cela écoute par défaut sur le port 8080. Vous pouvez changer le port avec --port=3000, et limiter les connexions aux détenteurs d’un token d’authentification valide avec --validateAuthTokens (les tokens sont gérés via l’interface d’administration du serveur).

Étape 5 : Mettre Nginx (ou Apache) en frontal pour TLS

Le serveur Expose ne termine pas SSL lui-même — vous avez besoin d’un reverse proxy. Obtenez un certificat wildcard (Certbot avec challenge DNS fonctionne bien pour *.expose.votredomaine.com), puis configurez Nginx :

server {
    listen        443 ssl;
    listen        [::]:443 ssl;
    server_name   expose.votredomaine.com *.expose.votredomaine.com;

    ssl_certificate      /etc/letsencrypt/live/expose.votredomaine.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/expose.votredomaine.com/privkey.pem;

    location / {
        proxy_pass             http://127.0.0.1:8080;
        proxy_read_timeout     60;
        proxy_connect_timeout  60;
        proxy_redirect         off;

        # Nécessaire pour WebSockets — la connexion tunnel d'Expose dépend de cela
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
sudo ln -s /etc/nginx/sites-available/expose /etc/nginx/sites-enabled/
sudo systemctl restart nginx

(La configuration Apache ou HAProxy suivant le même principe est documentée dans la documentation officielle d’Expose si vous préférez éviter Nginx.)

Étape 6 : Maintenir en fonctionnement avec Supervisor

sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/expose.conf
[program:expose]
command=/usr/bin/php /home/expose/server/expose-server serve expose.votredomaine.com
numprocs=1
autostart=true
autorestart=true
user=expose
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start expose

(Alternative : le dépôt du serveur Expose fournit un docker-compose.yaml. En copiant .env-example en .env, en configurant PORT, DOMAIN, ADMIN_USERNAME, et ADMIN_PASSWORD, puis en lançant docker-compose up -d, vous obtenez le même résultat avec moins de configuration manuelle, au prix d’une transparence moindre sur ce qui tourne.)

Étape 7 : Pointer votre client local vers votre serveur

Sur votre machine locale, avec le client Expose installé :

expose default-server expose.votredomaine.com
expose token VOTRE_TOKEN

Puis partagez un site avec un sous-domaine fixe — ce que vous ne pouvez pas faire sur le serveur public gratuit :

expose share http://ecommerce.test --subdomain=checkout

Votre application est maintenant en ligne à https://checkout.expose.votredomaine.com, sur une infrastructure que vous contrôlez, sans limite de temps par connexion ni frais par siège.


Quel outil correspond vraiment

Restez avec ngrok si vous avez besoin d’un tunneling TCP/TLS brut (bases de données, SSH, serveurs de jeux), ingress Kubernetes, SSO d’organisation ou documentation de conformité — rien de tout cela n’est supporté par Expose.

Considérez Expose si votre trafic est uniquement HTTP/HTTPS, que vous utilisez déjà Laravel/Herd, et que vous préférez gérer un VPS à 4$/mois plutôt que payer un abonnement annuel par siège pour des sous-domaines stables et personnalisés — ou si vous souhaitez simplement lire le code de l’outil de tunneling dont vous dépendez.


Historique des modifications

Corrections et ajouts effectués par rapport au brouillon original, vérifiés selon la documentation actuelle de ngrok et Expose, les métadonnées GitHub/Packagist, et la page de tarification de DigitalOcean :

  1. Timeouts de session ngrok — L’affirmation initiale selon laquelle ngrok impose des timeouts en version gratuite est fausse. La documentation indique que les endpoints gratuits n’ont pas de timeout et peuvent fonctionner indéfiniment en arrière-plan. Source : documentation Limits du plan gratuit ngrok.
  2. Sous-domaine aléatoire à chaque redémarrage ngrok — L’affirmation initiale était trop catégorique. Depuis 2023, chaque compte ngrok (même gratuit) peut réclamer un domaine statique permanent qui ne change pas au redémarrage ; seuls ceux qui ne l’ont pas revendiqué ont un sous-domaine aléatoire à chaque fois. Source : article “Static domains for all ngrok users” ; documentation des domaines ngrok.
  3. Limite de requêtes ngrok — La valeur de 40 connexions/minute était une approximation. La limite documentée actuelle est de 100 tentatives de connexion TCP/minute et 4 000 requêtes HTTP/minute (chiffres séparés). Source : documentation Limits / Tarification ngrok.
  4. Prix du droplet DigitalOcean — La référence initiale de 5$/mois est remplacée par 4$/mois pour le droplet le plus bas (512 MiB RAM, 1 vCPU, 10 GiB SSD, 500 GiB transfert). Source : page tarifaire DigitalOcean.
  5. Nom du package Composer — La commande initiale beyondcode/expose est remplacée par exposedev/expose ; ce dernier est la version officielle actuelle. Source : documentation installation Expose ; Packagist.
  6. Exigence PHP — La version requise est maintenant PHP 8.2+ dans composer.json, pas seulement une recommandation. Source : exposedev/expose composer.json.
  7. Architecture client/serveur — La correction la plus importante : le serveur auto-hébergé est désormais un package séparé, exposedev/server, cloné et installé séparément, et lancé avec expose-server serve <domaine>. La commande expose serve sur le client ne fonctionne plus et renvoie une erreur. La procédure d’auto-hébergement a été réécrite pour refléter cette architecture. Source : documentation “Starting the server” ; issue GitHub #1.
  8. Sous-domaine personnalisé en plan gratuit — La documentation indique que --subdomain nécessite un compte Pro/Team ou un serveur auto-hébergé. Le plan gratuit sharedwithexpose.com attribue un sous-domaine aléatoire à chaque connexion. Source : documentation partage.
  9. Tarification Expose — Ajout des prix actuels : Pro 79$/utilisateur/an, Équipe 229$/équipe/an (jusqu’à 10 utilisateurs), et rappel des limitations du plan Hobby gratuit. Source : page tarifaire expose.dev.
  10. Configuration Nginx — La configuration Nginx est mise à jour pour écouter en SSL sur le port 443, avec un certificat wildcard. La configuration précédente écoutait sur le port 80 et nécessitait Certbot séparément. Source : documentation SSL d’Expose.
  11. Configuration Supervisor — La commande command= a été corrigée pour pointer vers le binaire expose-server avec le domaine, conformément à la nouvelle architecture. Source : documentation “Keeping the server running”.
  12. Intégration Laravel — Laravel Valet supporte maintenant aussi cloudflared en plus de ngrok et Expose, via valet share-tool. Herd intègre Expose nativement dans ses paramètres, sans étape supplémentaire.

Ce document a été mis à jour pour refléter l’état actuel des outils, avec des références précises et vérifiées. La structure Markdown, les liens, et la syntaxe de commande sont conservés intacts pour un usage technique précis.

Continue from this article into the most relevant product guides and workflows.

Related Topics

#Expose reverse proxy, Laravel Valet share alternative, self-hosted PHP tunnel, Beyond Code Expose vs ngrok, Beyond Code Expose, ngrok alternative for PHP, Laravel local development, PHP developer tools, self-hosted reverse proxy, DigitalOcean Expose tutorial, expose localhost to internet, PHP tunneling solution, Laravel Valet share, Valet share ngrok alternative, replace ngrok in Laravel, open-source ngrok alternative, Expose vs ngrok performance, self-hosted Expose server, DigitalOcean $5 droplet tutorial, local environment sharing, PHP local server, secure tunnel for PHP, reverse proxy in PHP, host your own ngrok, ngrok free tier limitations, expose local server, PHP developer environment, Laravel ecosystem, Laravel deployment, artisan serve alternative, Beyond Code tools, local dev server, webhook testing PHP, local API testing, expose local web server, secure reverse proxy, open source tunnel, PHP tunnel script, custom domain Expose, self host webhook tunnel, bypass ngrok limits, localhost tunneling, developer infrastructure tools, expose local API to internet, share local website, PHP networking, web development proxy, reverse proxy tutorial, Laravel tips and tricks, PHP artisan share, expose client configuration, self-managed PHP proxy, open source developer tools, Laravel dev workflow

Keep building with InstaTunnel

Read the docs for implementation details or compare plans before you ship.

Share this article

More InstaTunnel Insights

Discover more tutorials, tips, and updates to help you build better with localhost tunneling.

Browse All Articles