Nginx:如何重写除图像之外的所有URL?

时间:2011-09-12 16:00:40

标签: regex nginx fastcgi url-rewriting

我是nginx的新手,我想将我的网站从Apache迁移到nginx。我的网站包含以下网址:

www.mywebsite.com/category/product/balloon
www.mywebsite.com/category/product/shoe
www.mywebsite.com/information/help

由于我正在使用PHP,我需要将所有URL重写为index.php,除非它是图像或者它是“假请求”。到目前为止我的nginx.config:

    #block fake requests
    location ~* \.(aspx|jsp|cgi)$ {
        return 410;
    }

    #rewrite all requests if it's not a image
    location / {
        root   html; 
        index  index.php 500.html;

        if (!-f $request_filename) {
            rewrite  ^(.*)$  /index.php?q=$1  last;
            break;
        }
    }

    error_page  404 /index.php;

    # serve static files directly
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
        access_log        off;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }               

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  E:/test2/html/$fastcgi_script_name;
        include        fastcgi_params;
    }

此配置不起作用,因为:
1.它不会阻止对.php文件的假请求,我不能将.php添加到(aspx | jsp | cgi)$
2.如果文件存在错误,它不会重写URL:它应该只直接提供静态文件
如果它是一个定义的文件类型(jpg | jpeg | gif | css | png | js | ico )$

我该如何解决这些问题?我非常感谢你能给我的每一个答案,澄清或反馈。

由于 麦克

1 个答案:

答案 0 :(得分:1)

您需要配置HttpRewriteModule。此模块可以使用正则表达式(PCRE)更改URI,并根据变量重定向和选择配置。

如果在服务器级别给出了该模块的指令,则在确定请求的位置之前执行它们。如果在该选定位置存在进一步的重写指令,则它们也被执行。如果由于在位置内执行指令而更改了URI,则会再次确定新URI的位置。