Nginx

nginx單頁js應用pushstate vs wordpress重寫規則

  • February 28, 2016

我想添加: /client 包含主幹 js 應用程序的子文件夾(帶有 pushstate) /admin 包含主幹 js 應用程序的子文件夾(有或沒有 pushstate)

當我在瀏覽器中打開我的http://example.dev/client時,它確實打開了單頁應用程序的 index.html,但是只要我將 /gallery/1/date 添加到 url,它就會打開wordpress 404 頁面而不是 pushstate。

這是我的 nginx 位置塊:

# {{ 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;

編輯:這是整個伺服器塊:(包括 wordpress.conf 包含上面的程式碼範例)

   # 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;
}

指令中的最後一個元素try_files應該是應用程序的 URI(/admin/index.html/client/index.html分別)。

事實上,這rewrite可能是多餘的。

嘗試:

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

有關詳細資訊,請參閱此文件

引用自:https://serverfault.com/questions/760218