2013-08-17 73 views
0

我是NGINX的新手,在正则表达式中很糟糕。这就是我需要:
是一个重写规则:
NGINX重写规则排除

  • 面具mysite.com/SOMETHING超过mysite.com/profile.html?id=SOMETHING
  • 排除有关mysite.com/images/(以及任何在该目录)从这个改写改写
  • 排除mysite.com/(根目录)
  • 排除有关mysite.com/ANOTHERFILE.html(或.PHP)从此改写
  • 我已经做了很多谷歌搜索似乎无法找到我需要的东西。甚至没有一篇支持文章告诉我更多关于正则表达式的nginx用法。这是我最好的猜测:

    location/{ 
        rewrite ^(?!(/images/))(.*)$ profile.html?id=$2 break; 
        return 403; 
    } 
    

    我把它放在我的nginx.conf文件中。它有点工作。这将重写任何请求,如mysite.com/SOMETHINGmysite.com/profile.html?id=SOMETHING,但是,它也将改写mysite.com/mysite.com/profile.html?id=。/images /排除似乎工作(因为我的图像正确加载),但是,即使去mysite.com/index.html将重写为mysite.com/profile.html?=id=index.html

    任何帮助将不胜感激。

    +0

    我对NGINX不够熟悉,给你一个正确的答案,但它听起来像你可能想使用['try_files'](http://wiki.nginx.org/HttpCoreModule#try_files),让你只重写实际上不存在为文件的URL。例如,'index.html'确实存在为一个文件,因此该URL不应该被重写。我会说这甚至可能会覆盖你的'images'情况,因为如果_directory_存在,它不应该重写。 –

    回答

    0

    我发现一个可行的解决方案,但我怀疑正则表达式匹配是吃了一些CPU时间,并可能减缓我的网站的性能。我将继续寻找改进的解决方案,但在这里就是我结束了解决问题:

    #Location routing for user accounts 
    location =/{ 
    break; 
    } 
    
    location/{ 
        rewrite ^(?!(/images/|(.*\..*)))(.*)$ /profile.html?id=$2 break; 
        rewrite ^(.*)$ $1 break; 
        return 403; 
    } 
    #end location routing for user accounts 
    

    我把我的nginx.conf文件的server { }块内。第一块,location =/ { },如果检查地点是/(Web根目录),只有/,然后什么都不做比正常的服务器操作不同,那么就应该逃避所有位置处理/ URL重写。

    接着,location/{块中的任何URI匹配的在根目录。这里是rewrite和正则表达式匹配的地方。首先,重写引擎尝试将URI与正则表达式^(?!(/images/|(.*\..*)))(.*)$进行匹配,这需要URI不以/images/file.extfile.ext(任何格式)开头,然后采用任何字(.*)并将其引发到重写的url中,然后全部网址重写中断,服务器提供页面。

    如果URI与正则表达式不匹配,例如,URI = /images/arrow.png或URI = /folder/或URI = /profile.php,那么它将转到下一个规则。下一个规则只需要你的URI并重写相同的URI。我不能说这种策略的效率,特别是因为你永远不会达到return 403;声明,我觉得也许有更好的方法来做到这一点。我尝试使用try_files,但我没有取得什么成就。这是现在的工作,并符合我的标准。似乎缺乏一点表现,但我必须忍受它,直到我可以改进。

    0

    嗯,我想一个规则可以处理这一切,但我会假设一对夫妇的事情,你需要确认。

    根位置有一个的index.php 用于/图像和/file.html我假设与实际路径中存在的文件和为他们服务,我将更多地解释后,我写的规则

    server { 
        server_name mydomain.com; # maybe www.mydomain.com too 
        index index.php; # or index.html, depending on ur app structure 
        location ~ /(.*) { 
         try_files $uri $uri/ /index.html?profile=$1; 
        } 
    } 
    

    /images/image.pngfile.php/file.html将全部由第一规则$uri匹配,根会的index.php服务(不是很确定,虽然),当所有的失败(如您/something URL,它会尝试/index.html?profile=something

    ps:我会的已经使用$request_uri代替$1但它包括第一/所以它会评估为/index.html?profile=/something,我认为不会与你的代码工作。

    +0

    'try_files' forwarder在我之前尝试过的时候由于某种原因似乎不适合我。我会玩这个建议,看看它是否比我目前的解决方案更好。我会将其作为答案发布。 –

    +0

    它显示500错误?或错误的回应?如果有错误,那么错误日志是什么 –