Installation FAQs
IMPORTANT: Always back up your database,.envfile, andstorage/directory before making any changes to your MailTrixy installation. Incorrect modifications can result in data loss or a broken application.
Remove Public From URL
Apache
To remove /public from the URL on Apache, create a .htaccess file in the root folder and add the following code:
RewriteEngine On RewriteRule ^(.*)$ public/$1 [L]
To also force HTTPS redirection, use:
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE] RewriteRule ^(.*)$ public/$1 [L]
For more details, read the article on Stack Overflow: How to Remove Public Index from URL
Note: This method does not work for localhost and subfolders, only for domains and subdomains.
LiteSpeed
If your server runs LiteSpeed (common on shared hosting with cPanel), the same .htaccess rules above will work. LiteSpeed is fully compatible with Apache rewrite rules. If you encounter issues, ensure the Rewrite module is enabled in your LiteSpeed configuration, or contact your hosting provider for assistance.
Hide or Deny Access to .env
The .env file contains sensitive information such as database credentials, API keys, and mail settings. To prevent direct access to this file, add the following to a .htaccess file in the root folder:
# Disable Directory listing Options -Indexes # Block access to .env fileOrder allow,deny Deny from all
For Nginx, add the following to your server block:
location ~ /\.env {
deny all;
return 404;
}
Debug Mode
Debug mode is helpful for tracking errors during development and troubleshooting, but it should never be left enabled on a live/production site as it exposes sensitive information including database credentials, API keys, and file paths.
To enable debug mode, open your .env file and change:
APP_DEBUG=false # Change this to true APP_DEBUG=true
After resolving the issue, always set it back to false:
APP_DEBUG=false
419 Error
A 419 Page Expired error occurs when the CSRF token has expired or is missing. This is a Laravel security feature. Common causes and solutions:
- Session expired - Refresh the page to get a new CSRF token. You can increase the session lifetime in your
.envfile:SESSION_LIFETIME=240 - APP_URL mismatch - Ensure
APP_URLin.envmatches the actual domain you are accessing (includinghttps://) - SESSION_DOMAIN - Verify
SESSION_DOMAINis set correctly in.env - Permissions - Ensure
storage/framework/sessionsdirectory is writable:chmod -R 775 storage/framework/sessions - Cookies blocked - Check that your browser is not blocking cookies from your domain
No Application Encryption Key
If you see the error "No application encryption key has been specified", it means the APP_KEY value in your .env file is missing or empty.
To generate a new application key, run:
php artisan key:generate
This will automatically set the APP_KEY value in your .env file. The key should begin with base64:. After generating, clear the config cache:
php artisan config:cache
.env File Missing
If your .env file is missing, MailTrixy will not be able to connect to the database or function properly. To create it:
- Copy the example environment file:
cp .env.example .env
- Generate a new application key:
php artisan key:generate
- Open the
.envfile and configure your database credentials, mail settings, and other required values - Clear the config cache:
php artisan config:cache
Note: The .env file may be hidden by your file manager. Enable "Show Hidden Files" in cPanel File Manager or use ls -la via SSH to see it.
Internal Server Error & 500
A 500 Internal Server Error indicates a server-side problem. Follow these steps to diagnose and resolve it:
- Enable debug mode temporarily to see the actual error:
APP_DEBUG=true
- Check the Laravel log file for the full stack trace:
tail -f storage/logs/laravel.log
- Ensure correct storage permissions:
chmod -R 775 storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache
- Verify .env exists with a valid
APP_KEY - Clear all caches:
php artisan config:clear php artisan cache:clear php artisan route:clear php artisan view:clear
- Check .htaccess - Ensure the
.htaccessfile in thepublic/directory is present and not corrupted - Verify PHP version - MailTrixy requires PHP 8.2 or higher
Important: Always set APP_DEBUG=false in production after debugging. Leaving it enabled exposes sensitive information.
MySQL Not Creating Table
If you encounter a SQLSTATE error regarding key length when running migrations, such as "Specified key was too long", add the following to your app/Providers/AppServiceProvider.php in the boot() method:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
This issue commonly occurs with older versions of MySQL (below 5.7.7) or MariaDB (below 10.2.2) that use the utf8 character set instead of utf8mb4. After making the change, re-run the migrations:
php artisan migrate
Class 'ZipArchive' Not Found
This error means the PHP zip extension is not installed or enabled on your server. MailTrixy uses ZipArchive for update packages and file exports.
To install it:
- Ubuntu/Debian:
sudo apt-get install php-zip && sudo systemctl restart apache2 - CentOS/RHEL:
sudo yum install php-zip && sudo systemctl restart httpd - cPanel: Go to Select PHP Version and enable the
zipextension
Verify the extension is loaded: php -m | grep zip
curl_init Error
The error "Call to undefined function curl_init()" means the PHP cURL extension is not installed or enabled. MailTrixy requires cURL for connecting to email providers, AI services, payment gateways, and other external APIs.
To install it:
- Ubuntu/Debian:
sudo apt-get install php-curl && sudo systemctl restart apache2 - CentOS/RHEL:
sudo yum install php-curl && sudo systemctl restart httpd - cPanel: Go to Select PHP Version and enable the
curlextension
Verify the extension is loaded: php -m | grep curl
404, 403 Errors
404 Not Found
If all routes return 404, the issue is typically with your web server configuration:
- Apache: Ensure
mod_rewriteis enabled andAllowOverride Allis set in your virtual host:sudo a2enmod rewrite sudo systemctl restart apache2
- Nginx: Add the
try_filesdirective:location / { try_files $uri $uri/ /index.php?$query_string; } - Route cache: Regenerate the route cache:
php artisan route:cache
403 Forbidden
A 403 error means the server is denying access. Common causes:
- Incorrect document root - Your web server should point to the
public/directory, not the project root - File permissions - Ensure correct ownership and permissions on application files
- Directory indexing disabled - This is normal and expected. Ensure your web server routes requests through
index.php
Payload Too Large
A 413 Payload Too Large error occurs when you try to upload a file or send data that exceeds your server's configured limits. To fix this, update the following settings:
PHP Settings (php.ini)
upload_max_filesize = 64M post_max_size = 64M memory_limit = 256M
Nginx (if applicable)
client_max_body_size 64M;
Add this inside the server or http block in your Nginx configuration, then restart Nginx:
sudo systemctl restart nginx
Apache (if applicable)
If using Apache with mod_fcgid, you may also need:
FcgidMaxRequestLen 67108864
exec() Function Disabled
Some features in MailTrixy may require the exec() PHP function (e.g., running Artisan commands programmatically). If you see an error about exec() being disabled:
- Open your
php.inifile and find thedisable_functionsdirective - Remove
execfrom the comma-separated list - Restart your web server
On shared hosting with cPanel, go to Select PHP Version → Options and check if exec is in the disabled functions list. If your host does not allow enabling it, contact their support team.
Storage Link / Images Not Showing
If images, avatars, or uploaded files are not displaying, the storage symbolic link may be missing or broken. MailTrixy requires a symbolic link from public/storage to storage/app/public.
To create the link, run:
php artisan storage:link
If you get an error that the link already exists but images still do not show:
- Delete the existing link:
rm public/storage
- Recreate it:
php artisan storage:link
On shared hosting without SSH access: You can manually create the symbolic link by adding the following to a temporary PHP file (e.g., public/symlink.php) and accessing it in your browser:
<?php
symlink('../storage/app/public', './storage');
echo 'Storage link created successfully!';
?>
Important: Delete the symlink.php file immediately after use for security.