【问题标题】:Nginx rewrite triggers downloadNginx 重写触发器下载
【发布时间】:2013-03-15 05:52:51
【问题描述】:

我正在努力在 nginx 上创建一个简单的重写 url。
我的配置如下:

location /foo/bar {
    rewrite ^/(.+)$ /index.php?p=$1 break;
}

例如/foo/bar/baz 应该变成 /foo/bar/index.php?p=baz(当然是内部)

但是,通过/foo/bar/ 访问的所有内容都会触发下载位于根目录的 index.php。我如何让它工作?

我也尝试过使用try_files,但不知道如何从$uri 中排除/foo/bar/ 路径。

【问题讨论】:

    标签: nginx rewrite


    【解决方案1】:

    改变

    rewrite ^/(.+)$ /index.php?p=$1 break;
    

    rewrite ^/(.+)$ /index.php?p=$1 last;
    

    基于http://wiki.nginx.org/HttpRewriteModule#rewrite

    last - 完成当前重写指令的处理并重新启动该过程(包括重写),并从所有可用位置搜索 URI 上的匹配项。

    [编辑] 使用 break 将留在同一位置块内。在您的情况下,该位置块内没有其他规则。所以默认情况下,nginx 会将其作为文件请求提供服务。

    【讨论】:

    • 真棒,做到了。非常感谢!
    • np。不过,不确定您的重写规则是否符合您的要求。但是使用'last'可以解决您的问题。 :)
    • @Bart 如果重写规则在位置块之外,它们是一样的。 Nginx 在位置块内部/外部对重写指令的处理方式不同
    【解决方案2】:

    PHP 文件不会被解释为常规文件。您需要设置一个像 FPM 这样的 CGI 服务器并将连接传递给这些进程。

    详情请见http://wiki.nginx.org/Configuration

    更新

    我不确定您的示例为什么会中断。但我猜你需要将rewrite 更改为try_files

    location /foo/bar {
        try_files $uri $uri/ /index.php?p=$uri;
    }
    

    【讨论】:

    • 我可以在任何地方正常访问php文件。仅这一条规则就会产生这种行为。
    • 你有更多关于服务器配置的信息吗?
    • 不太确定您需要哪些信息。我对服务器配置完全没有经验。前段时间有个朋友帮我弄的。这是我的nginx.conf,以防万一:pastebin.com/8ubv4Jn4
    • 我之前尝试过try_files,它有效,但这种方法的问题是(如上所述)我似乎无法从$uri 中排除~/foo/bar/,而我没有不一定要使用 php 剥离它。
    猜你喜欢
    • 2016-07-31
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多