我有一个 slim 应用程序,我想将其放置在域的目录路径下。目前,我使用提供的默认 slim 文件可以正常工作,但我想设置重写规则。
我想要的重写规则是,只接受以 /foobar/ 为前缀的任何 URL,并在达到 slim 之前删除 /foobar/。这是我之前使用的 apache 配置中的等效重写规则,它完全按照我的要求工作:
RewriteEngine On
RewriteRule ^/foobar(/.*) /foobar/public/index.php$1 [QSA,L]
我们使用此重写规则的方法是,$_SERVER['REQUEST_URI'] 参数保持完整的“http://localhost/foobar/测试",但是路径(Slim 匹配路线的路径)只是“/test”,所以我们不需要明确创建路线组。
我的 nginx 配置目前如下:
server {
listen 80;
server_name www.mysite.com mysite.com;
root /var/www/mysite/foobar/public;
# This is what I have tried adding, to no avail
rewrite ^/foobar(/.*) /index.php$1 break;
try_files $uri /index.php;
location /index.php {
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000; # "app" is a docker container
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
我已经尝试了好几个小时的各种规则。我不太确定自己在做什么,显然误解了 nginx 的工作原理,我相信 nginx 专家已经知道正确的答案。如果有人能提供我哪里出错的信息,我将不胜感激!
提前致谢!
更新尝试:
server {
listen 80;
server_name www.mysite.com mysite.com;
root /var/www/mysite;
index index.php;
location ~ ^/foobar(/.*)$ {
root /var/www/mysite/foobar/public;
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param PATH_INFO $1;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
}
答案1
你是对的,nginx 的重定向逻辑不同。
这种方法可能对你有用。但是,我还没有在使用这种模式的软件中使用过 nginx,所以我不确定这是否可行。此外,这可能不是执行此操作的最佳方式。
location ~ ^/foobar(/.*)$ {
fastcgi_connect_timeout 3s;
fastcgi_read_timeout 10s;
fastcgi_pass app:9000; # "app" is a docker container
include fastcgi_params;
fastcgi_param PATH_INFO $1;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}