Platform.sh User Documentation

Create a basic PHP app with a front controller

Sign up for Upsun

Get your free trial by clicking the link below.

Get your Upsun free trial

To handle dynamic requests to your PHP app, you might want to use a front controller. The following example shows how for such an app you might start defining your web server.

Define a document root Anchor to this heading

Start by defining your document root (where all your publicly visible pages are).

.platform.app.yaml
web:
    locations:
        '/':
            root: 'public'

Define a front controller Anchor to this heading

Define where all requests that don’t match a file in the document root are sent.

.platform.app.yaml
web:
    locations:
        '/':
            root: 'public'
            passthru: '/index.php'
            index:
                - index.php

In this case, /index.php acts as a front controller and handles dynamic requests.

Because it handles dynamic requests, you want to ensure that scripts are enabled and responses aren’t cached.

.platform.app.yaml
web:
    locations:
        '/':
            ...
            scripts: true
            # No caching for static files.
            # (Dynamic pages use whatever cache headers are generated by the program.)
            expires: -1

Define rules Anchor to this heading

You might want to define specific rules for the location. For example, you might want to allow all kinds of files except mp4 files.

.platform.app.yaml
web:
    locations:
        '/':
            ...
            # Allow all file types generally
            allow: true
            rules:
                # Disallow .mp4 files specifically.
                \.mp4$:
                    allow: false

Set different rules for specific locations Anchor to this heading

You might want to set specific rules for specific locations. For example, you might have files in your /public/images directory that are served at /images. You could define a specific cache time for them and limit them to only static image files.

.platform.app.yaml
web:
    locations:
        '/':
            ...
        # Set a 5 min expiration time for static files in this location.
        # Missing files are sent to front controller
        # through the '/' location above.
        '/images':
            expires: 300
            passthru: true
            # Do not execute PHP scripts from this location and do not
            # deliver their source code (for enhanced security).
            scripts: false
            allow: false
            rules:
                # Only allow static image files in this location
                '\.(jpe?g|png|gif|svgz?|ico|bmp)$':
                    allow: true

Complete example Anchor to this heading

.platform.app.yaml
web:
    locations:
        '/':
            root: 'public'
            passthru: '/index.php'
            index:
                - index.php
            scripts: true
            # No caching for static files.
            # (Dynamic pages use whatever cache headers are generated by the program.)
            expires: -1
            # Allow all file types generally
            allow: true
            rules:
                # Disallow .mp4 files specifically.
                \.mp4$:
                    allow: false
        # Set a 5 min expiration time for static files in this location.
        # Missing files are sent to front controller
        # through the '/' location above.
        '/images':
            expires: 300
            passthru: true
            # Do not execute PHP scripts from this location and do not
            # deliver their source code (for enhanced security).
            scripts: false
            allow: false
            rules:
                # Only allow static image files in this location
                '\.(jpe?g|png|gif|svgz?|ico|bmp)$':
                    allow: true

Is this page helpful?