我正在尝试在服务器上设置 FSyncMS(php 中的最小 php weave/sync1.1 服务器)。我已经设置了后端,但遇到一个问题,我无法找到让 nginx(我的前端 Web 服务器)正确将请求传递给 php 脚本的方法。
同步客户端使用斜线参数 URL 将参数传递给服务器:
scheme://server.com/user/1.0/a
应翻译为:
scheme://server.com/index.php/user/1.0/a
然后将后面的所有内容作为带有参数的 index.php 传递给后端。不幸的是,nginx 很乐意将 index.php/user/1.0/a 视为路径,而不是将 index.php 视为路径并将 /user/1.0/a 视为参数。结果:可预测的 404...
有关同步服务器实现的更多信息(不幸的是是德语):http://www.ohnekontur.de/2011/07/24/how-to-install-fsyncms-firefox-sync-eigener-server/
我该如何解决这个问题?
编辑:nginx 配置:
server {
listen 80;
server_name sync.server.com;
return 301 https://$server_name$request_uri; # enforce https
}
server {
listen 443 ssl;
server_name sync.server.com;
ssl_certificate /srv/syncserver/server.com.combined.crt;
ssl_certificate_key /srv/syncserver/server.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers !aNULL:!LOW:!MD5:!EXP:CAMELLIA:AES256:HIGH:AES128:RC4:!3DES:!SEED;
ssl_prefer_server_ciphers on;
access_log /srv/www/sync/logs/access.log;
error_log /srv/www/sync/logs/error.log;
root /srv/www/sync/public_html;
index index.php index.html;
location / {
ssi on;
index index.php index.shtml index.html index.htm;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
答案1
try_files
当不存在匹配的静态资产时,您无法将请求转移到 PHP。
例如:
location / {
try_files $uri $uri/ /index.php;
答案2
在这里发布我自己的答案以供将来参考。在从同事那里获得有关 try_files 的更多帮助并更详细地检查脚本后,问题有两个方面:
1) fsyncms 不喜欢位于主机的根目录中。它会通过删除尾随斜杠来清理路径,但如果是 /,则会留下一个空路径字符串,从而引发错误。
2)需要try_files(感谢Michael的指点!)但实际需要的规则与传递参数略有不同(例如,将fsync脚本放在服务器上的/fsync中时):
try_files $uri $uri/ /fsync/index.php/$args;
此后,客户端接受服务器 URI http(s)://server.com/fsync/。