Moving Craft’s files below the webroot

We recommend that all of Craft’s PHP files live above your server’s webroot, but sometimes that may not be possible due to hosting restrictions.

If you need to restructure your files so that everything lives below your webroot, follow these steps.

Step 1: Create a new app/ folder #

Create a new folder within your webroot called app/ (e.g. web/app/ if you’re sticking with Craft’s default web/ folder for your webroot).

Step 2: Protect the app/ folder #

If your web server is running Apache, and you’re allowed to create .htaccess files (via the AllowOverride directive), then create a new .htaccess file within your app/ folder, with this content:

deny from all

If you’re running Nginx or aren’t able to use .htaccess files, then you’ll need to ask your web hosting provider how to protect your app/ folder from public HTTP traffic. If this isn’t possible, then don’t proceed.

Step 3: Move the application files #

Move the following project files into your new app/ folder:

  • config/
  • modules/
  • storage/
  • templates/
  • translations/ (if you have it)
  • vendor/
  • .env
  • .env.example
  • composer.json
  • composer.lock
  • craft
  • craft.bat

At this point, your project’s file structure should look like this:

my-project.test/
└── web/
    ├── app/
    │   ├── config/
    │   ├── modules/
    │   ├── storage/
    │   ├── templates/
    │   ├── vendor/
    │   ├── .env
    │   ├── .env.example
    │   ├── .htaccess
    │   ├── composer.json
    │   ├── composer.lock
    │   ├── craft
    │   └── craft.bat
    ├── index.php
    └── ...

Step 4: Change the CRAFT_BASE_PATH #

Finally, we need to tell your index.php file where Craft has been moved to. Open it up and find this line:

define('CRAFT_BASE_PATH', dirname(__DIR__));

Change it to this:

define('CRAFT_BASE_PATH', __DIR__ . '/app');

Once you’ve done that, Craft should be back up and running, loaded from your new app/ folder.