将根地址重写为nginx中的子目录

时间:2013-07-19 04:26:37

标签: nginx

我正在将我的mediawiki网站转换为使用nginx作为后端用于php的静态文件的前端。到目前为止我已经完成了所有工作,除了当我查看根目录“example.com”时它尝试提供目录列表并给出403错误,因为我已经禁用并且没有索引文件。

我现在使用的apache重写规则就是:

RewriteRule ^$ /wiki/Main_Page [L]

我在nginx中尝试过与location指令类似的东西,但它不起作用:

location = / {
    rewrite "^$" /wiki/Main_Page;
}

我的其他位置指令是:

location / {
    try_files $uri $uri/ @rewrite;
}

location @rewrite {
    rewrite ^/wiki/(.*)$ /w/index.php?title=$1&$args;
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    try_files $uri /w/index.php?title=$1&$args;
    expires max;
    log_not_found off;
}

location ~ \.php?$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
}

我可以简单地在其中放入一个带有标题('Location:')的index.php文件,但我宁愿用重写规则正确地执行它。

我在网上找到的使用nginx运行mediawiki的所有示例都将wiki作为wiki.example.com而不是/ wiki /子目录运行。

编辑:我也尝试添加像这样的try_files:try_files $uri $uri/ @rewrite /wiki/Main_Page;,同样有403错误结果。

7 个答案:

答案 0 :(得分:34)

我在nginx irc聊天中找到了帮助。

基本上我需要做的是使用return而不是重写。所以我改变了这个:

location = / {
    rewrite "^$" /wiki/Main_Page;
}

到此:

location = / {
    return 301 http://www.example.com/wiki/Main_Page;
}

答案 1 :(得分:17)

我更喜欢使用:

location = / {
    return 301 http://$host/wiki/Main_Page;
}

答案 2 :(得分:3)

  1. 确保可以成功访问“ / wiki / Main_Page
  2. 签入服务器部分,没有全局重写规则。服务器部分中的重写规则将在位置部分之前执行。
  3. 在位置部分中使用重写规则,如下所示:

    location = / {
         rewrite "^.*$" /wiki/Main_Page break;    
    }
    
  4. 在这里注意“休息”。意味着打破重写周期。

    如果此页面位于后端服务器中,则应使用proxy_pass。

答案 3 :(得分:1)

您使用的答案是重定向,让您跳过/位置到/wiki位置,您可以尝试这样做

location = / {
    rewrite ^ /w/index.php?title=Main_Page&$args last;
}

这应该为/ URI

的Main_Page提供服务

答案 4 :(得分:0)

这是我的解决方法:

if ($uri = '/'){
    rewrite ^/(.*)$ http://example.com/wiki/Main_Page permanent;
}

答案 5 :(得分:0)

rewrite部分中添加server指令:

server {
   ...
   rewrite ^/$ /wiki/Main_Page
   ...
}

答案 6 :(得分:0)

如果要使用subdir的HTML文件作为默认index.html。例如,将/main/mainView.html复制到/index.html并在index.html中使用基标记来设置相对位置的基路径。