Web Hosting & ICT Solutions Fast, Reliable & Secure Solutions | 📍 Dar es Salaam | 📞 Support: +255 222 436 131 | 📧 support@fellahost.co.tz | 🌐 24/7 Call VoIP Support
FellaHost

Knowledgebase

Resolving Critical Laravel Deployment Failures on Plesk Print

  • Laravel
  • 543

Resolving Critical Laravel Deployment Failures on Plesk

Complete case study: 404 routing loops, SMS authentication errors, and database misconfiguration on a production Laravel 11 e-commerce platform.

Ref: FH-KB-2026-0419 Date: 19 April 2026 Platform: Plesk Obsidian 18.x Severity: Critical (P1) Author: Kitenge, Ibrahim A.

 

Executive Summary

A client's production Laravel 11 e-commerce application (xyz.domain.co.tz), hosted on a Plesk Obsidian 18.0.76 managed server (IP: xx.xxx.xxx.xxx), experienced three simultaneous critical failures after an initial deployment:

  1. Complete site inaccessibility — all pages returned HTTP 404 or infinite URL path duplication.
  2. SMS notification failures — FellaSMS API returned 403 Not Authorized on every dispatch.
  3. Database connectivity loss — the application could not establish a MySQL connection.

All three issues were traced to environment configuration errors within the .env file and conflicting Apache rewrite rules. The resolution required zero code changes to the application itself only infrastructure-level corrections.

 

Environment Details

Server

Plesk Obsidian 18.0.76

XX.XXX.XXX.XXX

Framework

Laravel 11.x

PHP 8.2 / MySQL

Domain

xyz.domain.com

Subdomain on Plesk

Database

database

MySQL Port number

Issue 1 — URL Routing Failure & 404 Errors

CRITICAL — Site Unreachable

Symptoms

Navigating to https://xyz.domain.com produced one of two outcomes:

  • HTTP 404 Not Found on all routes.
  • Infinite URL path duplication — the browser URL mutated into the server's filesystem path:
https://xyz.domain.co.tz/var/www/vhosts/domain.com/xyz.domain.com/public/var/www/vhosts/...

Root Cause Analysis

Three configuration elements were simultaneously fighting each other:

1. Plesk Document Root Misconfiguration

The domain's document root in Plesk was set to the project root instead of the /public subdirectory. Laravel requires the web server to serve files from the public/ folder.

2. Root .htaccess Conflict

A root-level .htaccess file contained rewrite rules that forcibly redirected all traffic into the /public/ prefix. Once Plesk's document root was corrected to point to /public, these rules created an infinite loop:

/.htaccess — Conflicting Rules
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]

3. APP_URL Misconfiguration

The .env file had APP_URL set to include the /public suffix, while an uncommented ASSET_URL was also competing:

.env — Before Fix
APP_URL=https://xyz.domain.com/public
ASSET_URL=https://xyz.domain.com/public

Resolution

Fix Applied (3-step):
  1. Updated the Plesk domain document root to point directly to /public.
  2. Commented out the conflicting rewrite rules in the root .htaccess.
  3. Corrected .env:
.env — After Fix
APP_URL=https://xyz.domain.com
#ASSET_URL=  (commented out — auto-detected)
/.htaccess — After Fix
<IfModule mod_rewrite.c>
    RewriteEngine On
    # RewriteRule ^(.*)$ public/$1 [L]    <-- DISABLED
</IfModule>

Issue 2 — Database Connection Failure

???? CRITICAL — SQLSTATE Error

Symptoms

After resolving the routing issue, the application threw a SQLSTATE[HY000] [2002] connection refused error on every page load.

Root Cause

The DB_CONNECTION variable in .env was set to the port number ("3306") instead of the driver name (mysql):

.env — Before Fix
DB_CONNECTION="3306"
DB_HOST="127.0.0.1"
DB_PORT="3306"
Impact: Laravel attempted to load a non-existent database driver named "3306", causing an immediate PDO exception on every request. The entire application was non-functional.

Resolution

.env — After Fix
DB_CONNECTION=mysql
DB_HOST="127.0.0.1"
DB_PORT="3306"

Issue 3 — SMS Notification Failures (NextSMS)

HIGH — Business Impact

Symptoms

All outbound SMS notifications (order confirmations, subscriber alerts) failed with a 403 Not Authorized response from the NextSMS API.

Root Cause

The NEXTSMS_PASSWORD in .env contained a # character. In Laravel's .env parser, the # character denotes the start of an inline comment. Since the value was not enclosed in double quotes, the password was silently truncated:

.env — Before Fix
NEXTSMS_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                  ↑
     Everything after # was silently discarded.
     Actual value sent to API: "@"
???? Key Insight: This is a well-known gotcha in .env file parsing. Any value containing #, spaces, or other special characters must be wrapped in double quotes to be parsed correctly by the DotEnv library.

Resolution

.env — After Fix
NEXTSMS_USERNAME="xxxxxxxxxxxx"
NEXTSMS_PASSWORD="xxxxxxxxxxxxxxxxxxxxx"
NEXTSMS_SENDER_ID="ABCDEFGH"

After wrapping all NextSMS credentials in double quotes, SMS dispatch was immediately restored and confirmed operational via a live test on the client's mobile device.

Verification & Results

✅solved
Routing Fixed

All pages load correctly.
No URL duplication.

✅solved
Database Connected

MySQL driver correctly loaded.
All queries functional.

✅solved
SMS Operational

NextSMS 200 OK.
Confirmed on client device.

Lessons Learned & Recommendations

1. Environment Variable Hygiene

Always wrap .env values in double quotes if they contain any of: # @ ! $ & ( ) spaces. The DotEnv parser treats # as a comment delimiter in unquoted strings.

2. Plesk + Laravel Document Root

When deploying Laravel on Plesk, the domain's Document Root must point to the /public directory. If a root-level .htaccess is used for the same purpose, it will conflict once Plesk is corrected — resulting in recursive path duplication.

3. Validate DB_CONNECTION vs DB_PORT

A common copy-paste error: DB_CONNECTION must be the driver name (e.g. mysql, pgsql, sqlite), not a port number. The port belongs in DB_PORT.

4. Post-Deployment Checklist

Recommended Verification Steps:
  • Run php artisan config:clear && php artisan cache:clear after any .env change.
  • Verify APP_URL matches the actual domain (no trailing /public).
  • Test database connectivity: php artisan migrate:status
  • Verify all API credentials with a test dispatch before going live.

Classification

Category

Server Configuration

Tags

Laravel, Plesk, .env, .htaccess, SMS

Resolution Time

~45 minutes

Status

 Resolved — Production Stable

Print / Save PDF

© 2026 FellaHost Company Limited — Knowledge Base

www.fellahost.co.tz  |  support@fellahost.co.tz  |  https://feedback.fellahost.co.tz


Was this answer helpful?
« Back