如何使用 Nginx 重写避免 Zend Framework 路由中的 index.php

如何使用 Nginx 重写避免 Zend Framework 路由中的 index.php

我正在尝试从默认 Zend Framework 路由中删除 index.php。我认为应该在服务器级别而不是应用程序上进行更正。(如果我错了,请纠正我,但我认为在服务器端执行此操作效率更高)。

我运行的是 Nginx 0.7.1 和 php-fpm 5.3.3

这是我的 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;
        }

}

基本上 www.domain.com/index.php/path/to/url 和 www.domain.com/path/to/url 提供相同的内容。

我想使用 nginx 重写来修复这个问题。

答案1

你需要类似这样的地点在每个地点。我只是为/blog位置写一个例子:

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

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

在您的配置中还发现:您可能希望fastcgi_split_path_info在 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;
}   

文档了解详情。

答案2

理想的解决方案确实需要应用程序的支持,因为它应该了解自己在哪个路径下运行。这允许它选择要提供的正确资源,并返回正确的链接和重定向。在这种情况下,nginx 配置将如下所示:

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

即简单地将 everything[0] 传递给特定的 PHP 脚本。这实际上可能适用于 Zend(我自己没有用过)。

如果应用程序无法修改以理解这一点,那么重写路径和修改内容就会变得一团糟。重写的关键是确保重写的路径不会再次被重写。以下将重写 /index.php 的路径并将其传递给 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;
}

如果这不起作用,可能是因为 Zend 没有正确处理请求——检查日志以查看它尝试定位的路径。

但是,这不会导致 HTML 中返回的链接或 Zend 发送的重定向使用不带“index.php”的路径,而且 nginx 似乎没有修改这些路径的机制。检查 Zend 是否有办法配置链接和重定向的根路径。

[0] 您显然希望直接提供静态内容,我已经省略了这一点。

答案3

尝试类似这样的操作:

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

答案4

# Rewrite rule adapted for Zend Framework
location / {
    index index.php;
    if (!-f $request_filename) {
        rewrite ^(.*)$ /index.php last;
    }
}

相关内容