在 Nginx 中复制 Apache Multiviews + PATH_INFO

在 Nginx 中复制 Apache Multiviews + PATH_INFO

我正在处理一些旧的 PHP 代码,这些代码以前是使用 Apache+Multiviews+PATH_INFO 提供的。我现在正尝试使用 nginx(我最近所有其他工作都使用它,并且非常喜欢它)来启动并运行这个网站。

问题出在诸如 /books/newreleases/1420 之类的 URL 上,实际上需要由 /books.php 处理(以便 php 能够看到 /books.php/newreleases/1420 并且具有适当的 PATH_INFO 信息)。

我知道为什么使用多视图是个坏主意,但重新开发这个网站来解决这个问题目前不是一个选择。

我可以通过使用重写来使这个特定示例工作:(rewrite ^/books/(.*)$ /books.php/$1;)但整个站点上的文件太多了,除非万不得已,否则无法手动为每个文件编写重写代码。此外,这让我很难过。

我已经阅读了这里所有类似的问题,但找不到这个特定案例的答案,也无法弄清楚是否有正确的方法来使用 try_files 来处理它。

以下是我的配置内容:

server {
    server_name foo.com www.foo.com;
    root /srv/www/foo.com/public_html;
    rewrite_log on;
    index index.html index.htm index.php;

    location / {
        rewrite ^/books/(.*)$ /books.php/$1;
        try_files $uri $uri.php $uri/ =404; 
   }

    location ~ ^.+\.php {
        try_files $uri.php $uri/ =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9050;
        fastcgi_index index.php;
        fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    }
}

相关内容