Como evitar index.php na rota do Zend Framework usando reescrita de Nginx

2

Estou tentando me livrar do index.php da rota padrão do Zend Framework. Eu acho que deve ser corrigido no nível do servidor e não no aplicativo. (Corrija-me se estiver errado, mas acho que fazê-lo no lado do servidor é mais eficiente).

Eu executo o Nginx 0.7.1 e o php-fpm 5.3.3

Esta é a minha configuração nginx

server {
    listen *:80;
        server_name domain;
        root   /path/to/http;
        index index.php;
        client_max_body_size 30m;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }
        location /min {
                try_files $uri $uri/ /min/index.php?q=;
        }
        location /blog {
                try_files $uri $uri/ /blog/index.php;
        }
        location /apc {
                try_files $uri $uri/ /apc.php$args;
        }

        location ~ \.php {
                include /usr/local/etc/nginx/conf.d/params/fastcgi_params_local;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                fastcgi_param SERVER_NAME $http_host;
                fastcgi_pass 127.0.0.1:9000;
        }

        location ~* ^.+\.(ht|svn)$ {
                deny  all;
        }

        # Static files location
        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
            expires max;
        }

}

Basicamente, www.domain.com/index.php/path/to/url e www.domain.com/path/to/url veicula o mesmo conteúdo.

Gostaria de corrigir isso usando a reescrita do nginx.

    
por Adam Benayoun 18.03.2012 / 16:13

4 respostas

1

Você precisará de locais semelhantes a este em cada um dos seus locais . Estou apenas escrevendo um exemplo para /blog location:

location /blog/ {
    try_files $uri $uri/ @blog;
}

location @blog {
    rewrite ^/blog/(.*)$ /blog/index.php/$1 last;
}

Também encontrado em sua configuração: você pode querer usar fastcgi_split_path_info em sua localização do PHP:

location ~ ^(.+\.php)(.*)$ {
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass   localhost:9000;
}   

Consulte a documentação para obter detalhes.

    
por 22.03.2012 / 23:37
1

A solução ideal envolve suporte do aplicativo, pois deve entender em que caminho está sendo executado. Isso permite que ele selecione o recurso correto a ser exibido e retorne os links e redirecionamentos corretos. Neste caso, a configuração do nginx seria algo como isto:

location / {
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
}

i.e. simplesmente passe tudo [0] até um script PHP específico. Isso pode realmente funcionar com o Zend (eu mesmo não usei).

Se o aplicativo não puder ser modificado para entender isso, as coisas ficarão confusas com a reconfiguração de caminhos e a modificação do conteúdo. O problema com a reescrita é garantir que o caminho reescrito não seja reescrito novamente. O seguinte irá reescrever caminhos para /index.php e passá-los para o Zend.

location ~ \.php(/|$) {
    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass 127.0.0.1:9000;
}

location / {
    rewrite ^/(.*)$ /index.php/$1;
}

Se isso não funcionar, provavelmente é porque o Zend não está manipulando a solicitação corretamente - verifique os logs para ver o caminho que está tentando localizar.

Isso não causará links retornados em HTML ou redirecionamentos enviados pelo Zend para usar o caminho sem "index.php", e o nginx não parece ter um mecanismo para modificá-los. Verifique se o Zend tem uma maneira de configurar o caminho da raiz para links e redirecionamentos.

[0] Você obviamente deseja veicular conteúdo estático diretamente, omiti isso.

    
por 26.03.2012 / 05:29
0

Tente algo assim:

rewrite ^/(.*)$    /index.php/$1;
    
por 19.03.2012 / 19:39
0
# Rewrite rule adapted for Zend Framework
location / {
    index index.php;
    if (!-f $request_filename) {
        rewrite ^(.*)$ /index.php last;
    }
}
    
por 11.04.2012 / 17:33