NGINX - 重写花哨的网址

时间:2013-10-19 20:50:40

标签: apache .htaccess nginx rewrite

我认为在Nginx中重写是直截了当的。看起来不是。

我想得到你们的帮助。我以前的设置是Apache2 + PHP。我的新设置是Nginx + PHP-FPM。

我想从Apache2转换一个简单的虚拟主机。

目录结构是:

  • / api(这是root)

    • VERSION(1)

      --- api.php

      --- .htaccess

Fx的。使用domain.tld / 1 /

.htaccess文件如下所示:

RewriteEngine on
RewriteRule ^([a-z]+)/([a-z]+)/api.json$ api.php?app=$1&sapp=$2 [L,QSA]
RewriteRule ^([a-z]+)/api.json$ api.php?app=$1 [L,QSA]

我的新Nginx服务器文件如下所示:

server {
        listen 80;
        root /var/www/domain.tld/api;
        index index.php index.html;

        server_name domain.tld;

        location /1/ {
                rewrite ^/([a-z]+)/([a-z]+)/api\.json$ /api.php?app=$1&sapp=$2;
                rewrite ^/([a-z]+)/api\.json$ /api.php?app=$1;
        }

        location ~ \.php$ {
                include php5;
        }
}

但是当我尝试查看时它不起作用:domain.tld / 1 / view / api.json或domain.tld / 1 / view / extended / api.json

任何人都可以解释并举一些例子来解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在这里查看NGiNX如何处理location块:http://nginx.org/en/docs/http/request_processing.html

正如您在案例中所看到的,请求仅由您的location /1/块提供,因为这是两个匹配中唯一的一个。问题是,NGiNX每个请求只使用一个位置块,所以一旦进入location /1/块,它就不会在以后转到其他位置块。 这里的解决方案是在最后的php5块中包含您的location /1/文件。

location /1/ {
    rewrite ^/([a-z]+)/([a-z]+)/api\.json$ /api.php?app=$1&sapp=$2;
    rewrite ^/([a-z]+)/api\.json$ /api.php?app=$1;
    include php5;
}