我正在用Nginx写一些干净的URL实现的PHP CMS代码。 为了提高我的代码的安全性,我想重写我的根目录中的所有请求/使用以下types:
rewrite ^(.*)$ /index.php?q=$1 last;
有了这种重写,其余的PHP脚本将无法从用户的一面访问(他们将只有,如果包括在PHP中,我是吗?)。 但是,我不想在一个位置重写请求(因为我/static/ ),因为我将只提供静态内容,如图像和CSS从该位置。 我怎样才能使这个重写不能在某些地方工作?
了解和使用location指令应该可以解决您的问题。 当位置仅由一个前缀string(即没有修饰符如'='或'〜*')时,最长的前缀string首先被匹配。 例如:
server { server_name example.org; root /var/www/site; location / { # Configuration A } location /static { # Configuration B }
在这个configuration中,URL example.org/static/foo.gif会匹配configurationB,因为前缀string/static比/ 。 同时, example.org/index.php?q=bar会匹配configurationA,因为这是唯一的匹配。
然后,您可以让configurationA用PHP提供内容,而configurationB提供静态内容。
另外,如果您尚未阅读,我强烈推荐阅读Nginx陷阱页面。 它解决了一些与您的情况高度相关的问题,比如重写重写,安全地使用fastcgi_pass等等。