如何在 Nginx 上重写 WebDav http 目标请求标头

如何在 Nginx 上重写 WebDav http 目标请求标头

使用下面的配置,GET、PUT、MKCOL 和其他东西可以正常工作,但 MOVE 和 COPY 则不行。

server {
    listen 80 ;
    listen [::]:80 ;
    server_name _;
    root /var/www/html;

    charset     utf-8;
    error_log  /var/log/nginx/error.log debug;
    rewrite_log on;

    auth_pam "WebDav auth";
    auth_pam_service_name "nginx";

    location /dav/ {
        autoindex on;
        client_body_temp_path /var/www/tmp;

        rewrite ^/dav/(.*)$ /dav/$remote_user/$1 break;

        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        dav_access user:rw group:rw all:r;
        create_full_put_path on;
    }
}

调试日志显示“http copy to”未被重写,然后无法打开它,返回 500 错误。我想我需要重写目标 http 请求标头并尝试以下方法:

set $destination $http_destination;
if ($destination ~ ^(http://www.foobar.test/dav)/(.*)$) {
    set $destination $1/$remote_user/$2;
    set $http_destination $destination;
}

但这也不起作用。你能告诉我如何使用重写指令来操作 WebDav 吗?

答案1

抱歉打扰了。可以使用以下方法自行解决标头-更多-nginx-模块. 整个简单配置是:

server {
    listen 80 ;
    listen [::]:80 ;
    server_name _;
    root /var/www/html;
    charset     utf-8;

    auth_pam "WebDav auth";
    auth_pam_service_name "nginx";

    location /dav/ {
        set $destination $http_destination;
        if ($destination ~ ^(http://www.foobar.test/dav)/(.*)$) {
            set $destination $1/$remote_user/$2;
            more_set_input_headers "Destination: $destination";
        }

        rewrite ^/dav/(.*)$ /dav/$remote_user/$1 break;

        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        dav_access user:rw group:rw all:r;
        create_full_put_path on;
    }
}

答案2

谢谢你。我在使用 NGINX 作为 https 代理来通过 http 运行 WebDAV 的后端 IIS 服务器时也遇到了类似的问题。

传递的 MOVE 请求中的目标标头是 https:// 地址,但我从后端服务器收到 400 错误,因为它运行在 http 上。我需要将目标标头从 https:// 修改为 http://,因此使用了以下内容

 set $destination $http_destination;
    if ($destination ~ ^(https://webdav.mydomain.com)/(.*)$) {
        set $destination "http://webdav.mydomain.com/$2";
        more_set_input_headers "Destination: $destination";
    }

这允许成功的 MOVE 请求

相关内容