I would like to add: /client subfolder containing backbone js app (with pushstate) /admin subfolder containing backbone js app (with or without pushstate)

And when I open my http://example.dev/client in the browser, it indeed opens the index.html of the single page app, but as soon as I add the /gallery/1/date to the url it opens the wordpress 404 page instead of pushstate.

This is my nginx locations block:

# {{ ansible_managed }}

location ^~ /admin {
    #alias /var/www/project/admin/public/;
    try_files $uri $uri/ /index.html;
    rewrite ^/admin/(.+/)$ /admin/index.html last;

location ^~ /client {
    #alias /var/www/project/client/public/;
    try_files $uri $uri/ /index.html;
    rewrite ^/client/(.+/)$ /client/index.html last;

# Prevent PHP scripts from being executed inside the uploads folder.
location ~* /app/uploads/.*\.php$ {
    deny all;

location / {
   try_files $uri $uri/ /index.php?$args;

# Set the max body size equal to PHP's max POST size.
client_max_body_size {{ php_post_max_size | default('25m') | lower }};

include h5bp/directive-only/x-ua-compatible.conf;
include h5bp/directive-only/extra-security.conf;
include h5bp/location/cross-domain-fonts.conf;
include h5bp/location/protect-system-files.conf;

Edit: This the whole server block: (include wordpress.conf holds the code sample above)

    # Ansible managed: /home/ivan/Dev/fapps/trellis/roles/wordpress-setup/templates/wordpress-site.conf.j2 modified on 2016-02-27 10:16:10 by ivan on ivan-ubuntu

server {
    listen 443 ssl http2;

  server_name   fapps.dev  ;
  access_log   /srv/www/example.com/logs/access.log;
  error_log    /srv/www/example.com/logs/error.log;

  root  /srv/www/example.com/current/web;
  index index.php index.htm index.html;

  charset utf-8;

  # See Virtualbox section at http://wiki.nginx.org/Pitfalls
  sendfile off;

  add_header Fastcgi-Cache $upstream_cache_status;

      include h5bp/directive-only/ssl.conf;
    include h5bp/directive-only/ssl-stapling.conf;

    ssl_dhparam /etc/nginx/ssl/dhparams.pem;
    ssl_buffer_size 1400; # 1400 bytes to fit in one MTU

                add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

    ssl_certificate         /etc/nginx/ssl/example.com_self_signed.pem;
      ssl_trusted_certificate /etc/nginx/ssl/example.com_self_signed.pem;
      ssl_certificate_key     /etc/nginx/ssl/example.com_self_signed.key;

  include includes.d/example.com/*.conf;
  include wordpress.conf;

  location ~ \.php$ {
    try_files $uri =404;
    error_page 404 /index.php;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
    fastcgi_pass unix:/var/run/php-fpm-wordpress.sock;

server {
  listen 80;
  server_name fapps.dev www.fapps.dev;
  return 301 https://$host$request_uri;

server {
  listen 443 ssl http2;
  server_name www.fapps.dev;
  return 301 $scheme://fapps.dev$request_uri;

The last element in your try_files directive should be the URI of the app (/admin/index.html and /client/index.html respectively).

In fact, the rewrite is probably redundant.


location ^~ /admin {
    try_files $uri $uri/ /admin/index.html;
location ^~ /client {
    try_files $uri $uri/ /client/index.html;

See this document for details.

| improve this answer | |
  • Thanks, that did it. However I'm having problem changing this to index.php. Instead of parsing the php file it serves a bin copy of the index.php. – steakoverflow Feb 29 '16 at 16:52
  • @vani Remove the ^~ modifiers (which are unnecessary anyway) to allow your existing PHP location to work. See this for location syntax. – Richard Smith Feb 29 '16 at 17:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.