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頁面。
我認為使用
last
而不是break
解決問題,因為這使得 nginx 不會使用重寫的 URL 路徑重新處理位置。