# WordPress site at the root domain and a Laravel admin panel at the /subdirectory path on Cloudpanel

**URL:** <https://forum.hhf.technology/t/wordpress-site-at-the-root-domain-and-a-laravel-admin-panel-at-the-subdirectory-path-on-cloudpanel/421>\
**Category:** PHP\
**Tags:** wordpress, cloudpanel, laravel\
**Created:** [November 26, 2024, 12:42pm UTC](https://forum.hhf.technology/t/wordpress-site-at-the-root-domain-and-a-laravel-admin-panel-at-the-subdirectory-path-on-cloudpanel/421 "2024-11-26T12:42:22Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![hhf.technoloy](https://forum.hhf.technology/user_avatar/forum.hhf.technology/hhf.technoloy/32/68_2.png) [@hhf.technoloy](https://forum.hhf.technology/u/hhf.technoloy)\
**Post date:** [November 26, 2024, 12:42pm UTC](https://forum.hhf.technology/t/wordpress-site-at-the-root-domain-and-a-laravel-admin-panel-at-the-subdirectory-path-on-cloudpanel/421/1 "2024-11-26T12:42:23Z")

</div>

The Nginx configuration to better handle wp and larvel as backend setup. Here are the key changes and improvements:

1. Main Changes:

- Improved the Laravel backend location block using `^~` modifier to ensure priority
- Changed the Laravel root to use `alias` instead of `root` directive
- Updated the try\_files directive for Laravel to use `$query_string`
- Properly separated WordPress and Laravel paths

1. Key Features:

- SSL/HTTPS enforcement
- HTTP/2 enabled, HTTP/3 disabled as specified
- Static file caching and CORS headers
- Security measures (blocking sensitive files)
- Separate handling for WordPress and Laravel applications

1. Structure:

- First server block (ports 80/443): Handles main traffic, SSL, and routing
- Second server block (port 8080): Handles WordPress backend processing

1. Paths:

- WordPress site: served at root (/)
- Laravel admin: served at /backend
- Both applications are completely separate as requested

Important considerations:

1. Make sure your directory structure matches:

```auto
/home/your-user/htdocs/yourdomain.com/
├── wordpress_files (for main site)
└── backend/
    └── public/ (Laravel public directory)

```

1. Verify that the following placeholders are properly set in your server configuration:

- {{root}}
- {{php\_fpm\_port}}
- {{php\_settings}}
- {{ssl\_certificate}}
- {{ssl\_certificate\_key}}
- {{varnish\_proxy\_pass}}

1. The configuration assumes Varnish is being used for the WordPress site (due to the varnish\_proxy\_pass directive).

```nginx
server {
    listen 80;
    listen [::]:80;
    listen 443 quic;
    listen 443 ssl;
    listen [::]:443 quic;
    listen [::]:443 ssl;
    http2 on;
    http3 off;
    
    {{ssl_certificate_key}}
    {{ssl_certificate}}
    
    server_name test-wp.hhf.technology;
    {{root}}
    {{nginx_access_log}}
    {{nginx_error_log}}

    # Force HTTPS
    if ($scheme != "https") {
        rewrite ^ https://$host$request_uri permanent;
    }

    # Let's Encrypt verification
    location ~ /.well-known {
        auth_basic off;
        allow all;
    }

    {{settings}}

    # Deny access to .git directories
    location ~/\.git {
        deny all;
    }

   location /backoffice {
        alias /home/hhf-test-wp/htdocs/test-wp.hhf.technology/backoffice/public;
        index index.php index.html;
        try_files $uri $uri/ @laravel;
        
        # PHP handling for Laravel
        location ~ \.php$ {
            if (!-f $request_filename) {
                return 404;
            }
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param HTTPS "on";
            fastcgi_param SERVER_PORT 448;
            fastcgi_intercept_errors on;
            fastcgi_pass 127.0.0.1:{{php_fpm_port}};
            fastcgi_param PHP_VALUE "{{php_settings}}";
            fastcgi_index index.php;
        }

        # Deny access to sensitive files
        location ~ /\. {
            deny all;
        }
    }

    # Laravel URL Rewriting
    location @laravel {
        rewrite ^/backoffice/(.*)$ /backoffice/index.php?/$1 last;
    }
    # WordPress Admin
    location ~/(wp-admin/|wp-login.php) {
        #auth_basic "Restricted Area";
        #auth_basic_user_file /home/site-user/.htpasswd;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 7200;
        proxy_send_timeout 7200;
        proxy_read_timeout 7200;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;
    }

    # Main WordPress Site
    location / {
        {{varnish_proxy_pass}}
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header X-Varnish;
        proxy_redirect off;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 720;
        proxy_send_timeout 720;
        proxy_read_timeout 720;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;
    }

    # Static Files
    location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map)$ {
        # WordPress Multisite Subdirectory
        rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 break;
        rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 break;
        add_header Access-Control-Allow-Origin "*";
        add_header alt-svc 'h3=":443"; ma=86400';
        expires max;
        access_log off;
    }

    if (-f $request_filename) {
        break;
    }
}

# WordPress PHP Processing Server
server {
    listen 8080;
    listen [::]:8080;
    server_name test-wp.hhf.technology;
    {{root}}
    
    include /etc/nginx/global_settings;
    try_files $uri $uri/ /index.php?$args;
    index index.php index.html;
    
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        try_files $uri =404;
        fastcgi_read_timeout 3600;
        fastcgi_send_timeout 3600;
        fastcgi_param HTTPS "on";
        fastcgi_param SERVER_PORT 443;
        fastcgi_pass 127.0.0.1:{{php_fpm_port}};
        fastcgi_param PHP_VALUE "{{php_settings}}";
    }
    
    # WordPress Multisite Subdirectory
    if (!-e $request_filename) {
        rewrite /wp-admin$ https://$host$uri permanent;
        rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
        rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
    }
    
    if (-f $request_filename) {
        break;
    }
}

```
