0

我是 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/SOMETHINGto mysite.com/profile.html?id=SOMETHING,但是,它也会重写mysite.com/to mysite.com/profile.html?id=。/images/ 排除似乎有效(因为我的图像加载正确),但是,甚至mysite.com/index.html会重写为mysite.com/profile.html?=id=index.html.

    任何帮助将不胜感激。

    4

    2 回答 2

    0

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

    对于根位置,/images 和 /file.html 有一个 index.php 我会假设这些文件以确切的路径存在并为它们提供服务,我将在编写规则后进行更多解释

    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 (虽然不是很确定),当一切都失败时(比如你的/somethingURL,它会尝试/index.html?profile=something

    ps:我会使用$request_uri而不是,$1但它包含第一个/,因此它会评估为/index.html?profile=/something并且我认为这不适用于您的代码。

    于 2013-08-17T10:02:41.333 回答
    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 根目录) 和 ONLY /,然后与正常的服务器操作没有什么不同,然后应该避免所有位置处理/url 重写。

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

    如果 URI 中没有与正则表达式匹配的内容,例如 URI =/images/arrow.png或 URI =/folder/或 URI = /profile.php,则它会继续执行下一条规则。下一条规则只获取您的 URI 并重写相同的 URI。我不能说这种策略的效率,特别是因为你永远不会达到return 403;声明,我觉得也许有更好的方法来做到这一点。我尝试使用try_files,但我没有成功。这目前有效,符合我的标准。似乎有点缺乏性能,但我必须忍受它,直到我能做出改进。

    于 2013-08-17T20:57:32.353 回答