我试图清楚地了解Symfony2的nginx配置文件发生了什么,现在是:
server {
listen 80;
autoindex on;
server_name example.com;
root /var/www/example.com/web;
rewrite ^/app\.php/?(.*)$ /$1 permanent;
location / {
index app.php;
try_files $uri $uri/ @symfony;
}
location @symfony {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/app\.php(/|$) {
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
简而言之,我正试图在用户可以设置的每个可能的URI中删除app.php,例如example.com/app.php/demo或只是example.com/app.php。
此配置实际上适用于上述URI,但如果尝试访问“root”URI example.com,则会导致重定向循环。
如果我从try_files中删除$ uri /并在那里只留下$ uri和一个后备@symfony,一切正常,除非我无法访问任何目录,因为它们将由SF处理。
我没有想法,对nginx和重写实际如何工作进行了大量研究,但就目前而言,这对我来说是一个死胡同。如果你能找到一个解决方案来保持$ uri / in try_files并退出前面的循环,请告诉我。
答案 0 :(得分:0)
来自Nginx Tips的此解决方案为我工作。这几乎与你的相同,但并不完全相同。
server {
server_name domain.tld www.domain.tld;
root /var/www/project/web;
location / {
# try to serve file directly, fallback to rewrite
try_files $uri @rewriteapp;
}
location @rewriteapp {
# rewrite all to app.php
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(app|app_dev|config).php(/|$) {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
error_log /var/log/nginx/project_error.log;
}