我正在使用 Nginx 中的干净 URL 实现编写一些 PHP CMS 代码。为了提高代码的安全性,我想/
使用以下类型重写根目录中的所有请求:
rewrite ^(.*)$ /index.php?q=$1 last;
使用这种重写后,其余的 php 脚本将无法从用户端访问(只有包含在 php 中时才可以访问,对吗?)。但是,我不想在一个位置重写请求(对于 mi 来说,这对我来说是这样的/static/
),因为我将仅从该位置提供静态内容,例如图像和 css。如何使此重写在某些位置不起作用?
答案1
理解并使用该location
指令应该可以解决您的问题。当 location 后面仅跟有前缀字符串(即没有诸如“=”或“~*”之类的修饰符)时,将首先匹配最长的前缀字符串。例如:
server {
server_name example.org;
root /var/www/site;
location / {
# Configuration A
}
location /static {
# Configuration B
}
在此配置中,URLexample.org/static/foo.gif
将与配置 B 匹配,因为前缀字符串/static
比 长/
。同时,example.org/index.php?q=bar
将与配置 A 匹配,因为这是唯一匹配项。
然后,您可以让配置 A 使用 PHP 提供内容,而配置 B 提供静态内容。
另外,我强烈建议您阅读Nginx 陷阱如果您还没有查看,请查看此页面。它解决了一些与您的情况高度相关的问题,例如繁重的重写、安全地使用 fastcgi_pass 等等。