4

经过大约 2 小时的谷歌搜索并尝试了各种方法后,我向您寻求帮助。

任务:在 nginx 中将空白 url 重写为某些内容,并将其他所有内容重写为不同的内容。

所以,如果我导航到 subdomain.somedomain.tld,我想获得 index.php,如果我去 subdomain.somedomain.tld/BlAaA,我会被重定向到 index.php?url=BlAaA。例外情况是 /img、/include 下的文件和 index.php 本身。他们不会被重写。

第二部分已经起作用,白名单也是如此,但我无法弄清楚或找到完成整个想法的东西。

工作部分:

server {
  listen       80;
  server_name  subdomain.domain.tld;

  location / {
    include php.conf;
    root    /srv/http/somefolder/someotherfolder/;

    if ( $uri !~ ^/(index\.php|include|img) ){
      rewrite /(.*) /index.php?url=$1 last;
    }

    index   index.php;
  }
}

@pablo-b 提供的答案几乎解决了我的问题。这种方法只存在两个问题: 1:PHP-FPM 现在需要在 /etc/php/php-fpm.conf 中设置 /include/ 下文件的扩展名(例如 style.css、background.jpg) .limit_extensions。我原来的 php.conf 是按照以下方式工作的

location ~ \.php {
    #DO STUFF
}

哪个 nginx 不喜欢,因为它有点覆盖了您的建议中的 location /index.php 部分。不过,如果有足够的时间,我可以解决这个问题。

2:$request_uri 产生“/whatever”,而不是“whatever”作为我的 url= 参数的值。当然,我可以在我的 php 代码中解析出“/”,但我的原始解决方案没有添加前导“/”。有什么优雅的方法可以解决这个问题吗?

4

1 回答 1

4

我建议避免if使用与使用的模式匹配方法相关的优先级并使用不同的位置(文档):

#blank url
location = / {
    return 302 http://subdomain.domain.tld/index.php;
}

#just /index.php
location = /index.php {
    include common_settings;
}

#anything starting with /img/
location ^~ /img/ {
    include common_settings;
}

#anything starting with /include/
location ^~ /include/ {
    include common_settings;
}

#everything else
location / {
    return 302 http://subdomain.domain.tld/index.php?url=$uri_without_slash;
}

在一个名为的单独配置文件中common_settings

include php.conf;
root    /srv/http/somefolder/someotherfolder/;
index   index.php;

编辑:添加删除 url 中的第一个斜杠:

在您的 conf 中,在任何server指令之外:

map $request_uri $uri_without_slash {
    ~^/(?P<trailing_uri>.*)$ $trailing_uri;
}
于 2013-09-05T04:28:02.917 回答