我正在将别人编写的 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 路径重新处理位置。