请考虑我的根目录中的以下目录结构:
/resources/css
/resources/js
/resources/templates
/resources/images
我想提供上述目录中的静态内容,但我还想允许像这样重写:
rewrite ^/([a-z]+)(.*)$ /index.php?p1=$1&p2=$2;
例如myurl.com/register/...
重写为myurl.com/index.php?p1=register&p2=...
但是该规则也会重写/resources/
,那么我该如何将其排除/resources
在重写之外?还是我需要再次重写?我尝试过的所有方法似乎都不起作用,所以显然我不明白其中的道理。
答案1
下面的配置是我发现有效的,因为位置语句都具有相同的优先级,并且它们按顺序进行检查。
这有助于我理解位置块的优先级:
location = <path> (longest match wins)
location ^~ <path> (longest match wins)
location ~ <path> (first defined match wins)
location <path> (longest match wins)
配置如下:
// match all css/js/images in resource path
location ~ ^/resources {
root /mypath/myurl.com;
try_files $uri =404;
break;
}
// allow myurl.com/register etc:
location ~ ^/([a-z]+)/(.*)$ {
root /mypath/myurl.com;
rewrite ^/([a-z]+)(.*)$ /index.php?p1=$1&p2=$2;
}
// everything else:
location ~ / {
root /mypath/myurl.com;
index index.php;
}
欢迎评论!
答案2
您可以使用这个例子:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
set $id $1;
}
if ($request_method = POST ) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
}
如需了解更多信息,请访问:http://wiki.nginx.org/HttpRewriteModule
答案3
您可以为该 URI 添加另一个位置处理程序,该位置处理程序与存在的文件匹配 - 如果不存在则中断。
location ~* /resources/(css|js|templates|images) {
if (!-f $request_filename) {
break;
}
root /path/to/resources;
}
rewrite ^/([a-z]+)(.*)$ /index.php?p1=$1&p2=$2;