Nginx url 重写目录作为参数

Nginx url 重写目录作为参数

我想写一个诸如 mysite.com/l360/profile/55 之类的 URL,然后让 NGINX 加载 mysite.com/l360/home.php?path=profile/55。

不幸的是,这次我不能直接切换到 apache2。所以我必须找到一种方法让 NGINX 正常工作。

我现在的问题是 mysite.com/l360 加载 home.php 并且 mysite.com/l360/home.php 正常工作。当我尝试执行 mysite.com/l360/profile 时,它​​会尝试从服务器下载 BIN 文件。

以下是该部分的配置:

    location / {
            try_files $uri $uri/ $uri.html $uri.php?$query_string;
            client_max_body_size 50M;
            client_body_buffer_size 128k;
    }

location /l360 {
    try_files $uri $uri/ @l360rw;
}
location @l360rw {
    return 302 /home.php?path=$uri;
}

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
            fastcgi_index home.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            include fastcgi_params;

    }

答案1

我会尝试使用捕获组的正则表达式和重写语句. 类似这样

location ^/l360/profile/([0-9]+)$ {
  rewrite /l360/home.php?path=profile/$1
}

location ~ \.php$ {
  try_files $uri =404;
  // I removed the next line mostly because my config doesn't have it
  // REMOVED fastcgi_split_path_info ^(.+\.php)(/.+)$;
  fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
  fastcgi_index home.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_buffers 16 16k;
  fastcgi_buffer_size 32k;
  include fastcgi_params;
}

我还没有测试过,如果它能像写的那样工作,我会很惊讶。不过它应该能给你一些关于如何做到这一点的线索。

毫无疑问,还有其他方法可以做到这一点,其他人可能会给出更好的答案,或者可能有助于完善我的答案以使其正常工作。

答案2

我找到了一个可行的解决方案,只需要我稍微修改一下代码。以下内容将给出 path=l360/test/ 的参数,因此所需的只是一种方法来从路径名中删除文件的主目录:

    location /l360 {
            index home.php;
            try_files /$uri /$uri/ /l360/home.php?path=$uri;
    }

    location / {
            try_files $uri $uri/ $uri.html $uri.php?$query_string;
            client_max_body_size 50M;
            client_body_buffer_size 128k;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
            fastcgi_index home.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            include fastcgi_params;

    }

相关内容