.htaccess Nginx使用重写规则重写子目录下不存在的文件

.htaccess Nginx使用重写规则重写子目录下不存在的文件,.htaccess,nginx,rewrite,.htaccess,Nginx,Rewrite,Nginx在同一位置下从.php重写为.php 我正在尝试将一个包含大量.htaccess文件(93个)的站点从Apache移动到Nginx。 有800多条重写规则需要转换。为了优化性能,我决定 将规则放置在单独的嵌套位置块(总共61个块)下 但是我在重写一些规则时遇到了问题 要求: /test/abc/pics/应重定向到/test/abc/wallpaps/ /如果文件存在,则应直接提供test/abc/pics/800/a.jpg。如果不存在,, 然后应该将请求重写为/test/abc/p

Nginx在同一位置下从.php重写为.php

我正在尝试将一个包含大量.htaccess文件(93个)的站点从Apache移动到Nginx。 有800多条重写规则需要转换。为了优化性能,我决定 将规则放置在单独的嵌套位置块(总共61个块)下

但是我在重写一些规则时遇到了问题

要求:
  • /test/abc/pics/应重定向到/test/abc/wallpaps/
  • /如果文件存在,则应直接提供test/abc/pics/800/a.jpg。如果不存在,, 然后应该将请求重写为/test/abc/pics/pic.php,这将 在第一次请求时创建文件。随后的请求将直接送达
  • /test/abc应重定向到/test/abc.html
  • /test/abc.html应重写为/test/index.php
  • /test/abc/def/year-2014.php应重写为/test/abc/def/index.php
  • 所有静态文件(.gif、.jpg、.png、.mpg…)都应直接提供,过期时间很长
  • 所有以.html结尾的文件都应该直接提供。如果文件不存在,则应将请求重写为/fallback.php
  • 所有以.php或/结尾的文件都应由php-FPM执行。如果文件不存在,则应将其重写为/fallback.php
  • 配置: php fpm.conf

    include fastcgi.conf;
    fastcgi_index index.php;
    fastcgi_pass 127.0.0.1:9000;
    
    问题:
  • 由于回退规则是正则表达式,因此会选择它们,而不是特定于位置的规则
  • 如果我对所有特定于位置的规则使用
    ~
    前缀,则不会执行回退规则。 对
    /test/abc/pics/800/a.jpg
    的请求将被重写为
    /test/abc/pics/pic.php
    ,该请求将再次与 相同的位置配置。因此,文件不会执行,而是按原样下载
  • 因此,我添加了“
    include php-fpm.conf””。但这导致了一切
    
    /test/abc/pics/
    下的请求(包括现有的
    .jpg
    文件)传递给PHP-FPM。这会导致访问被拒绝错误, 因为
    security.limit\u extensions
    只允许
    .php
    扩展
  • 我做错了什么?是否有一种简单的方法可以根据扩展名为所有现有文件提供服务 只有不存在的文件符合位置块/重写规则

    include fastcgi.conf;
    fastcgi_index index.php;
    fastcgi_pass 127.0.0.1:9000;