主机名 RAX3000M 型号 CMCC RAX3000M eMMC version 架构 AR...
作成日: 2025年10月17日
使用モデル GPT-5 Thinking by Chat01
作成日: 2025年10月17日
使用モデル GPT-5 Thinking by Chat01
主机名 RAX3000M
型号 CMCC RAX3000M eMMC version
架构 ARMv8 Processor rev 4 (v8l) x 2
温度 CPU: 70.4°C, WiFi: 64°C
目标平台 mediatek/mt7981
固件版本 ImmortalWrt 21.02 build 20241217 / LuCI openwrt-21.02
/www/clipboard.html:
root@RAX3000M:/etc/lighttpd/conf.d# cat ../lighttpd.conf
var.log_root = "/var/log/lighttpd/"
var.server_root = "/www/"
var.state_dir = "/var/run/"
var.home_dir = "/var/lib/lighttpd/"
var.conf_dir = "/etc/lighttpd"
var.vhosts_dir = server_root + "/vhosts"
var.cache_dir = "/var/cache/lighttpd"
var.socket_dir = home_dir + "/sockets"
server.document-root = "/root"
server.upload-dirs = ( "/tmp" )
server.errorlog = log_root + "error.log"
server.pid-file = state_dir + "lighttpd.pid"
server.username = "http"
server.groupname = "www-data"
server.port=8081
$SERVER["socket"] == "[::]:8081" { }
dir-listing.encoding="utf-8"
server.dir-listing="enable"
index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm",
)
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
include "/etc/lighttpd/mime.conf"
include "/etc/lighttpd/conf.d/*.conf"
./20-auth.conf:
#######################################################################
server.modules += ( "mod_auth" )
auth.backend = "plain"
auth.backend.plain.userfile = "/etc/lighttpd/lighttpd.user"
auth.require = ( "/" =>
(
"method" => "basic",
"realm" => "Server Status",
"require" => "valid-user"
),
)
#auth.cache = ("max-age" => "600")
#######################################################################
./20-authn_file.conf:
server.modules += ( "mod_authn_file" )
./30-webdav.conf:
#######################################################################
server.modules += ( "mod_webdav" )
#|/)" {
webdav.activate = "enable"
webdav.is-readonly = "enable"
webdav.sqlite-db-name = "/root/rax3000m_emmc/webdav.db"
#webdav.log-xml = "disable"
#webdav.opts = ( ... )
#}
#######################################################################
网页显示:
Access to XMLHttpRequest at 'http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/' from origin 'http://192.168.11.1' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
clipboard.html:174 PROPFIND http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/ net::ERR_FAILED
sendWebDAVRequest @ clipboard.html:174
loadImages @ clipboard.html:188
(anonymous) @ clipboard.html:246
favicon.ico:1 GET http://192.168.11.1/favicon.ico 404 (Not Found)
Request URL
http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/
Referrer Policy
strict-origin-when-cross-origin
Request URL
http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/
Request Method
OPTIONS
Status Code
404 Not Found
Remote Address
192.168.11.1:8081
Referrer Policy
strict-origin-when-cross-origin
如何解决?
主机名 RAX3000M
型号 CMCC RAX3000M eMMC version
架构 ARMv8 Processor rev 4 (v8l) x 2
温度 CPU: 70.4°C, WiFi: 64°C
目标平台 mediatek/mt7981
固件版本 ImmortalWrt 21.02 build 20241217 / LuCI openwrt-21.02
/www/clipboard.html:
root@RAX3000M:/etc/lighttpd/conf.d# cat ../lighttpd.conf
var.log_root = "/var/log/lighttpd/"
var.server_root = "/www/"
var.state_dir = "/var/run/"
var.home_dir = "/var/lib/lighttpd/"
var.conf_dir = "/etc/lighttpd"
var.vhosts_dir = server_root + "/vhosts"
var.cache_dir = "/var/cache/lighttpd"
var.socket_dir = home_dir + "/sockets"
server.document-root = "/root"
server.upload-dirs = ( "/tmp" )
server.errorlog = log_root + "error.log"
server.pid-file = state_dir + "lighttpd.pid"
server.username = "http"
server.groupname = "www-data"
server.port=8081
$SERVER["socket"] == "[::]:8081" { }
dir-listing.encoding="utf-8"
server.dir-listing="enable"
index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm",
)
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
include "/etc/lighttpd/mime.conf"
include "/etc/lighttpd/conf.d/*.conf"
./20-auth.conf:
#######################################################################
server.modules += ( "mod_auth" )
auth.backend = "plain"
auth.backend.plain.userfile = "/etc/lighttpd/lighttpd.user"
auth.require = ( "/" =>
(
"method" => "basic",
"realm" => "Server Status",
"require" => "valid-user"
),
)
#auth.cache = ("max-age" => "600")
#######################################################################
./20-authn_file.conf:
server.modules += ( "mod_authn_file" )
./30-webdav.conf:
#######################################################################
server.modules += ( "mod_webdav" )
#|/)" {
webdav.activate = "enable"
webdav.is-readonly = "enable"
webdav.sqlite-db-name = "/root/rax3000m_emmc/webdav.db"
#webdav.log-xml = "disable"
#webdav.opts = ( ... )
#}
#######################################################################
网页显示:
Access to XMLHttpRequest at 'http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/' from origin 'http://192.168.11.1' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
clipboard.html:174 PROPFIND http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/ net::ERR_FAILED
sendWebDAVRequest @ clipboard.html:174
loadImages @ clipboard.html:188
(anonymous) @ clipboard.html:246
favicon.ico:1 GET http://192.168.11.1/favicon.ico 404 (Not Found)
Request URL
http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/
Referrer Policy
strict-origin-when-cross-origin
Request URL
http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/
Request Method
OPTIONS
Status Code
404 Not Found
Remote Address
192.168.11.1:8081
Referrer Policy
strict-origin-when-cross-origin
如何解决?
你这个报错本质是跨域(CORS) + 预检(OPTIONS) 请求 404,再叠加了几个配置问题:
http://192.168.11.1
(80 端口),WebDAV 在 http://192.168.11.1:8081
(不同端口 ⇒ 不同源)Access-Control-Allow-*
头;OPTIONS
命中 404(WebDAV/路径/鉴权没有正确处理);webdav.is-readonly = "enable"
),即使过了 CORS,PUT/DELETE
也会失败。下面给出两种可选的解决方案,任选其一即可。
把 clipboard.html
从 8081 提供,并让前端请求同一端口的 WebDAV。
/root
):shmv /www/clipboard.html /root/clipboard.html
js// 把 webdavUrl 改成相对路径(不含协议和端口) const webdavUrl = '/rax3000m_emmc/clipboard/images/';
之后用 http://192.168.11.1:8081/clipboard.html
打开页面即可。
注意:你的
textApi = '/cgi-bin/clipboard.sh'
仍然走 80 端口的 uhttpd(LuCI),会再次跨域。
- 最简单:把
textApi
也写成绝对地址http://192.168.11.1:8081/cgi-bin/clipboard.sh
,并在 lighttpd 做反代(见下方“可选:反向代理”);- 或者把 CGI 脚本迁到 lighttpd(需要启用 cgi/fcgi,不展开)。
可选:在 lighttpd 给 /cgi-bin/
做反向代理到 80 端口(这样依然同源 8081):
text# /etc/lighttpd/conf.d/35-proxy.conf server.modules += ( "mod_proxy" ) proxy.server = ( "/cgi-bin/" => ( ( "host" => "127.0.0.1", "port" => 80 ) ) )
然后把前端里的 textApi
改为:
jsconst textApi = '/cgi-bin/clipboard.sh';
shmkdir -p /root/rax3000m_emmc/clipboard/images chown -R http:www-data /root/rax3000m_emmc chmod -R 775 /root/rax3000m_emmc
把 /etc/lighttpd/conf.d/30-webdav.conf
改成按路径生效,并加上 CORS。示例(可直接覆盖成下面这段):
text####################################################################### ## WebDAV on /rax3000m_emmc/clipboard/images ####################################################################### server.modules += ( "mod_webdav", "mod_setenv" ) $HTTP["url"] =~ "^/rax3000m_emmc/clipboard/images($|/)" { webdav.activate = "enable" webdav.is-readonly = "disable" # 允许 PUT/DELETE webdav.sqlite-db-name = "/root/rax3000m_emmc/webdav.db" # CORS 响应头(按需要精确到你的来源) setenv.add-response-header = ( "Access-Control-Allow-Origin" => "http://192.168.11.1", "Access-Control-Allow-Credentials" => "true", "Access-Control-Allow-Methods" => "GET, PUT, DELETE, PROPFIND, MKCOL, OPTIONS", "Access-Control-Allow-Headers" => "Authorization, Depth, Content-Type, Destination, Overwrite", "Access-Control-Max-Age" => "86400" ) # 预检请求不做鉴权拦截,直接 200 $HTTP["request-method"] == "OPTIONS" { auth.require = () } }
说明:
mod_setenv
用于添加响应头;OPTIONS
子块清空了auth.require
,否则浏览器的预检不会带凭据,会被 401/403 拦住;webdav.is-readonly = "disable"
才能上传/删除。
你当前 /etc/lighttpd/conf.d/20-auth.conf
把 全站 "/"
都做了 Basic 认证,会影响预检。改成只在 WebDAV 路径上鉴权(或保持你需要的其它路径),并与上面的 OPTIONS 豁免配合:
textserver.modules += ( "mod_auth", "mod_authn_file" ) auth.backend = "plain" auth.backend.plain.userfile = "/etc/lighttpd/lighttpd.user" # 仅保护 WebDAV 目录(如需) $HTTP["url"] =~ "^/rax3000m_emmc/clipboard/images($|/)" { auth.require = ( "" => ( "method" => "basic", "realm" => "WebDAV", "require" => "valid-user" ) ) }
如果你还要保护别的目录,可按需再加对应的
$HTTP["url"]
块。不要再用对"/"
的全局保护,否则还得额外豁免预检。
sh/etc/init.d/lighttpd restart
自检(在路由器上执行):
sh# 预检(应返回 200 且含 Access-Control-Allow-*) curl -i -X OPTIONS \ 'http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/' \ -H 'Origin: http://192.168.11.1' \ -H 'Access-Control-Request-Method: PROPFIND' \ -H 'Access-Control-Request-Headers: authorization, depth' # 列目录(PROPFIND) curl -i -X PROPFIND \ 'http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/' \ -u asdf:asdf -H 'Depth: 1' # 上传(PUT) curl -i -X PUT --data-binary @/etc/banner \ 'http://192.168.11.1:8081/rax3000m_emmc/clipboard/images/test.txt' \ -u asdf:asdf
你的 JS 已经手动加了 Authorization: Basic ...
,这是可以的;只要服务器允许跨域并放行预检就行。
另外建议把允许的方法里包含 MKCOL
(有些 WebDAV 客户端会用到)。
asdf/asdf
太弱了,至少换个强密码;Access-Control-Allow-Credentials: true
,Origin 不能用 *
,要写成具体来源(上面已示范);favicon.ico
的 404 无关紧要,想消除就放一个到 /root/favicon.ico
或在 HTML 里 <link rel="icon" href="data:,">
;要么把页面和 WebDAV 放到同一个端口(最简单),要么在 8081 上正确开启 CORS + 放行 OPTIONS + 允许写。上面的配置按步骤套上去即可解决你看到的 No 'Access-Control-Allow-Origin'
和预检 404。