Upsun User Documentation

Create a basic PHP app with a front controller

Try Upsun for 15 days
After that, enjoy the same, game-changing Upsun features for less with the First Project Incentive!ยน A monthly $19 perk!
ยนTerms and conditions apply
Activate your 15-day 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).

.upsun/config.yaml
applications:
  myapp:
    source:
      root: "/"
    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.

.upsun/config.yaml
applications:
  myapp:
    source:
      root: "/"
    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.

.upsun/config.yaml
applications:
  myapp:
    source:
      root: "/"
    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.

.upsun/config.yaml
applications:
  myapp:
    source:
      root: "/"
    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.

.upsun/config.yaml
applications:
  myapp:
    source:
      root: "/"
    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

.upsun/config.yaml
applications:
  myapp:
    source:
      root: "/"
    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?