nginx 配置-如果文件存在则重定向

nginx 配置-如果文件存在则重定向

我正在将别人编写的 php 应用程序从 apache 转换到 nginx。

开发人员在 .htaccess 中有此信息

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,NC,L]

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.*)$ api.php [QSA,NC,L]

    RewriteCond %{REQUEST_FILENAME} -s
    RewriteRule ^(.*)$ api.php [QSA,NC,L]
</IfModule>

我简单理解为
“如果文件/目录不存在,则将请求重写为 api.php?rquest=$uri”
“如果文件/目录存在,则将请求重写为 api.php”

我尝试在 nginx 中复制此操作,但遇到了问题。我创建了一个位置指令

location / {
    # if the file or folder doesn't exist add it as arguments to api.php
    try_files $uri $uri/ /api.php?rquest=$uri&$args;

    index api.php;
}

我想要做的就是,如果文件/目录确实存在,就直接转到某个静态 index.html 页面。

我尝试使用重写服务器级“if”语句

if (-e $request_filename){
    rewrite ^(.*)$ /api.php break;
}

但这会破坏其他有效的位置指令。

我如何实现这个目标: 如果文件/目录确实存在,则重定向到静态 html 页面

- - - - - - - - 更新 - - - - - - - -

我最终得到了类似的东西

server {
    ...

    root  /home/ballegroplayer/api/public;
    index index.php index.html index.htm;

    try_files $uri $uri/ /api.php?rquest=$uri&$args;

    if (-e $request_filename){
        rewrite ^(.*)$ /api.php last;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

最终,在“if”语句中我们无法重定向到静态文件,因为在“try_files”指令成功后,我们会被重定向到api.php确实存在的文件,这会导致触发“if”语句,并且我们始终会得到静态 html 页面。

答案1

我认为使用last而不是break可以解决问题,因为这使得 nginx 不会使用重写的 URL 路径重新处理位置。

相关内容