ArchWiki / WebDAV
ArchWiki / WebDAV
WebDAV (Web Distributed Authoring and Versioning) is an extension of HTTP/1.1 and therefore can be considered to be a protocol. It contains a set of concepts and accompanying extension methods to allow read and write across the HTTP/1.1 protocol. Instead of using NFS or SMB, WebDAV offers file transfers via HTTP.
The goal of this article is to setup a simple WebDAV configuration using a web server.
Server
Apache
Install the Apache HTTP Server.
Uncomment the modules for DAV and auth_digest:
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so
LoadModule auth_digest_module modules/mod_auth_digest.soUncomment the include line for conf/extra/httpd-dav.conf:
# Distributed authoring and versioning (WebDAV)
Include conf/extra/httpd-dav.confCheck the following line in /etc/httpd/conf/extra/httpd-dav.conf:
DAVLockDB /etc/httpd/var/DavLockMake sure you add it outside of any other directives, for instance right under the DocumentRoot definition.
If you want a clean setup consider a /srv/dav structure instead of /etc/httpd/uploads, but that's what i found at the default.
Next, check the aliases (also outside of any directives) in /etc/httpd/conf/extra/httpd-dav.conf:
DavLockDB "/etc/httpd/var/DavLock"
Alias /uploads "/etc/httpd/uploads"
<Directory "/etc/httpd/uploads">
Dav On
AuthType Digest
AuthName DAV-upload
# You can use the htdigest program to create the password database:
# htdigest -c "/etc/httpd/user.passwd" DAV-upload admin
AuthUserFile "/etc/httpd/user.passwd"
AuthDigestProvider file
# Allow universal read-access, but writes are restricted
# to the admin user.
<RequireAny>
# require that these methods are used (PROPFIND allows directory listing) ...
Require method GET POST OPTIONS PROPFIND
# or that the user is admin (f.e. PUT is required to write a file, MKCOL for folders)
Require user admin
# -- Notes ---
# more info on methods in the webdav rfc: http://www.webdav.org/specs/rfc4918.html
# POST treated as PUT: https://datatracker.ietf.org/doc/html/rfc5995
</RequireAny>
</Directory>Create the directory:
# mkdir -p /etc/httpd/varCheck the permissions of DavLockDB's directory and ensure it is writable by the webserver user http:
# chown -R http:http /etc/httpd/var
# mkdir -p /etc/httpd/uploads
# chown -R http:http /etc/httpd/uploadsnginx
Install nginx-mainline (the mainline variant of nginx) and nginx-mainline-mod-dav-ext.
At the top of your /etc/nginx/nginx.conf and outside any blocks, add:
load_module /usr/lib/nginx/modules/ngx_http_dav_ext_module.so;Add a new location for WebDAV to your server block, for example:
location /dav {
root /srv/http;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
# Adjust as desired:
dav_access user:rw group:rw all:r;
client_max_body_size 0;
create_full_put_path on;
client_body_temp_path /srv/client-temp;
autoindex on;
allow 192.168.178.0/24;
deny all;
}The above example requires the directories /srv/http/dav and /srv/client-temp to exist.
You may want to use bind mounts to make other directories accessible via WebDAV.
rclone
Install the rclone package. It supports exporting a remote or local directory using webdav.
To serve the contents of /srv/http with no authentication:
$ rclone serve webdav /srv/httpCaddy
Install the caddy-webdav-git package, or use xcaddy-bin and build Caddy with the WebDAV module:
$ xcaddy build --with github.com/mholt/caddy-webdavTo serve the contents of /srv/webdav on the path dav using port 80, add the following to your Caddyfile:
:80 {
rewrite /dav /dav/
webdav /dav/* {
root /srv/webdav
prefix /dav
}
file_server
}Then run Caddy:
$ caddy runClient
Cadaver
After installation, test the WebDAV server:
$ cadaver http://localhost/dav
dav:/dav/> mkcol test
Creating `test': succeeded.
dav:/dav/> ls
Listing collection `/dav/': succeeded.
Coll: testDolphin
To create a permanent WebDAV folder in Dolphin select Network in the remotes section of the places sidebar, then press the Add Network Folder button. The network folder wizard will appear. Select WebFolder (webdav), and fill in the subsequent form.
Alternately just click the path bar and then enter the url with webdav:// protocol specifier.
Nautilus
Install the gvfs and gvfs-dnssd packages.
In Nautilus choose "connect to server" and enter the address with dav:// or davs:// protocol specified:
dav://127.0.0.1/davIf you get a "HTTP Error: Moved permanently" with dav://, try to use davs:// as the protocol instead.
rclone
rclone is a command line tool that lets you sync to/from, or mount (with many caching options), remote file systems including WebDAV.
Thunar
Install the gvfs and gvfs-dnssd packages.
In Thunar press Ctrl+l and enter the address with dav or davs protocol specified:
davs://webdav.yandex.ruAuthentication
There are numerous different protocols you can use:
plain
digest
others
Apache
Using htdigest(1) (remove the -c option if the file exists):
# htdigest -c /etc/httpd/conf/passwd WebDAV usernameMake sure digest authentication is enabled in httpd.conf by the presence of this entry: LoadModule auth_digest_module modules/mod_auth_digest.so
Using plain htpasswd(1) (remove the -c option if the file exists):
# htpasswd -c /etc/httpd/conf/passwd usernameNext, httpd.conf must be edited to enable authentication. One method would be to require the user foo for everything:
<Directory "/home/httpd/html/dav">
DAV On
AllowOverride None
Options Indexes FollowSymLinks
AuthType Digest # substitute "Basic" for "Digest" if you used htpasswd above
AuthName "WebDAV"
AuthUserFile /etc/httpd/conf/passwd
Require user foo
</Directory>AuthName must match the realm name passed when using the htdigest command for digest authentication. For basic/plain authentication, this line may be removed. Also, make sure that the AuthUserFile path matches that used with the htdigest or htpasswd commands above.
If you want to permit everybody to read, you could use this in your httpd.conf
<Directory "/home/httpd/html/dav">
DAV On
AllowOverride None
Options Indexes FollowSymLinks
AuthType Digest # substitute "Basic" for "Digest" if you used htpasswd above
AuthName "WebDAV"
AuthUserFile /etc/httpd/conf/passwd
Require all granted
<LimitExcept GET HEAD OPTIONS PROPFIND>
Require user foo
</LimitExcept>
</Directory>Do not forget to restart httpd.service after making changes.
If you get an 405 error with Apache, add DirectoryIndex disabled to your Directory section.
Troubleshooting
Some file explorers cannot edit directories in nginx WebDAV
nginx WebDAV requires a directory path ends with a slash (/), but some file explorers does not append a / at the end of the path.
This can be worked-around, by either removing the corresponding checking code and recompile it, or by appending the following code in a nginx server block to add / at the end of a request, if needed:
# The configuration was based on: https://nworm.icu/post/nginx-webdav-dolphin-deken/
# if the request method is MKCOL or is to a directory, add / at the end of the request if it was missing
if ($request_method = MKCOL) {
rewrite ^(.*[^/])$ $1/ break;
}
if (-d $request_filename) {
rewrite ^(.*[^/])$ $1/ break;
}
# if the request method is copy or move a directory, add / at the end of the request if it was missing
set $is_copy_or_move 0;
set $is_dir 0;
if (-d $request_filename) {
set $is_dir 1;
}
if ($request_method = COPY) {
set $is_copy_or_move 1;
}
if ($request_method = MOVE) {
set $is_copy_or_move 1;
}
set $is_rewrite "${is_dir}${is_copy_or_move}";
if ($is_rewrite = 11) {
rewrite ^(.*[^/])$ $1/ break;
}