如何使用Nginx摆脱Symfony2 URI中的app.php

时间:2014-11-09 08:15:11

标签: symfony nginx rewrite

我试图清楚地了解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并退出前面的循环,请告诉我。

1 个答案:

答案 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;
}