Nginx

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

  • October 29, 2017

我正在將其他人編寫的 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頁面。

我認為使用last而不是break解決問題,因為這使得 nginx 不會使用重寫的 URL 路徑重新處理位置。

引用自:https://serverfault.com/questions/880724