NGINX重写规则与排除

时间:2013-08-17 01:08:00

标签: regex url nginx rewrite masking

我是NGINX的新手,对正则表达式很恐怖。这就是我需要的:
重写规则:

  • 使用mysite.com/profile.html?id=SOMETHING掩饰mysite.com/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/SOMETHING之类的任何请求重写为mysite.com/profile.html?id=SOMETHING,但是,它也会将mysite.com/重写为mysite.com/profile.html?id=。 / images / exclusion似乎有效(因为我的图像正确加载),但是,即使转到mysite.com/index.html也会重写为mysite.com/profile.html?=id=index.html

    非常感谢任何帮助。

    2 个答案:

    答案 0 :(得分:0)

    我认为一条规则可以处理所有这些,但我会假设一些事情你需要确认它。

    对于root位置,有一个index.php 对于/ images和/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,root将提供index.php(虽然不太确定)并且当所有失败时(与您的/something网址一样,它会尝试/index.html?profile=something

    ps:我会使用$request_uri而不是$1,但它包含第一个/,所以它会评估为/index.html?profile=/something,我认为这不适用于你的{{1}}代码。

    答案 1 :(得分: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
    

    我把它放在server { }文件的nginx.conf块内。第一个块location =/ { }检查位置是/(Web根目录)还是仅/,然后执行与正常服务器操作不同的任何操作,然后它应该转义所有位置处理/ url重写。

    接下来,location / {块匹配webroot中的任何URI。这里是rewrite和正则表达式匹配的位置。首先,重写引擎尝试将URI与正则表达式^(?!(/images/|(.*\..*)))(.*)$匹配,这要求URI不以/images/ OR {{1}开头(以该格式提供的任何内容),然后接受任何单词file.ext,并将其抛入重写的url,然后所有url重写中断,服务器为页面提供服务。

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