Nginx位置使用和不使用位置正则表达式

时间:2013-09-09 09:27:52

标签: nginx

要将我的小项目(不基于其中一个已知框架)包含到现有网站中,我已将以下配置添加到Nginx

server {
    listen 80 default_server;
    server_name localhost;
    access_log /var/log/nginx/dev.access.log;
    error_log /var/log/nginx/dev.error.log;
    root /var/www;
    index index.php;

    [...]

    location /www.my-project.com {
        alias /var/www/www.my-project.com/web;
        index index.php;
        if (-f $request_filename) { break; }
        rewrite ^(.*)$ /www.my-project.com/index.php last;
        location ~ /[^/]+/index\.php$ {
            include fastcgi_params;
            fastcgi_pass unix:/var/run/fcgi.sock;
            fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
        }
    }

一切正常(除了我希望阻止在location指令中列出子目录名称),所以我可以调用http://localhost/www.my-project.com。但是当调用http://localhost/www.my-project.com.blabla时,会调用上面的location指令并提供我的内部错误页面。所以我尝试将位置指令更改为

    location ~ ^/www\.my-project\.com(/|$) {

但这导致任何现有文件(CSS,JS ...)被重写为index.php,然后返回404本身。为什么更改位置会导致这种可怕的行为,我发现location /www.my-project.comlocation ~ ^/www\.my-project\.com(/|$)之间没有逻辑差异。

1 个答案:

答案 0 :(得分:2)

我建议从重写中排除资产,你可以通过添加一个新的位置来做到这一点,就像这样

location /(css|js|images) {
    root /var/www/www.my-project.com/web;
    try_files $uri =404;
}

对于位置问题,您可以使用=

匹配确切的位置
location = /www.my-project.com {