Wednesday, December 15, 2004

ลอง WebDAV กับ Apache

กำลังเซ็งกับการที่ต้องรับส่งไฟล์ระหว่าง Windows กับ Linux บ่อยๆ ถ้าเป็นเครื่องใกล้ตัวก็เปิด Samba เอา แต่ถ้าไกลหน่อย ที่ผ่านมาก็ใช้ sftp, scp ฯลฯ เพราะพอร์ตของ Samba มักจะถูกบล็อคเอาไว้ มีแค่ 22 (SSH), 80 (HTTP), 443 (HTTPs) เท่านั้นที่มักจะเปิดให้ใช้กันได้

อีกอย่างไม่อยากเปิด Samba ให้ชาวอินเทอร์เน็ตทั่วโลกเข้ามาลองเล่นได้

วันนี้ไม่รู้ทำไม จู่ๆก็นึกถึง WebDAV (Web-based Distributed Authoring and Versioning) ขึ้นมา เป็นส่วนขยายของ HTTP สำหรับแก้ไขและจัดการไฟล์บนเว็บเซิร์ฟเวอร์. โปรแกรม Explorer บน Windows เปิดใช้ได้เลย น่าจะเอามาใช้แทน Samba ได้ เล่นผ่าน Web Proxy Server ก็น่าจะได้ (เพราะใช้ HTTP Protocol ?) ไหนๆ Apache ก็รันไว้อยู่แล้ว

ทดลอง TryLinux

การติดตั้งบน TryLinux ไม่ยาก หลังจากมี apache (Apache 1.3) แล้ว ก็ติดตั้ง libapache-mod-dav เพิ่มอีกตัวหนึ่ง จะได้โมดูลสำหรับทำ webdav มา และถูกเพิ่มเข้าไปในไฟล์ /etc/apache/modules.conf ให้เองโดยอัตโนมัติ

เพิ่งรู้ว่า ถ้าจะเพิ่มลดรายการโมดูลในไฟล์นี้ เขาไม่ทำกันด้วยมือ แต่ใช้คำสั่ง /usr/sbin/apache-modconf apache enable|disable ... มันก็จะสร้างไฟล์ /etc/apache/modules.conf ขึ้นมาใหม่เอง

การตั้งค่าที่เกี่ยวกับ WebDAV จะอยู่ใน /etc/apache/conf.d/libapache-mod-dav มีตัวอย่างการตั้งค่า WebDAV ให้ดูด้วย

สมมติว่า Apache รันอยู่บนเครื่อง b.com และจะเปิด WebDAV ที่ http://b.com/dav ก็ไปแก้ใน httpd.conf ว่า

<VirtualHost *>
ServerName b.com
...
...
<Location /dav>
DAV On
AuthType Basic
AuthName TestDAV
AuthUserFile /path/to/httpauth.txt
AuthGroupFile /dev/null
Order deny,allow
Deny from all
Allow from 192.168.  .b.com
<LimitExcept GET OPTIONS>
require valid-user
</LimitExcept>
</Location>
</VirtualHost>
ในกรณีนี้จะบังคับให้ผู้ใช้ Login ก่อน (require valid-user) และจำกัด IP/Domain ของผู้ที่จะต่อเข้ามาเล่นได้ (Allow from) สองอย่างนี้อันไหนไม่จำเป็นก็เอาออกได้

จากนั้นก็ไปสร้าง mkdir dav ใต้ DocumentRoot ให้เรียบร้อย

WindowsXP เจ้าปัญหา

ปัญหาที่พบคือ ถ้าใช้จาก Windows XP โดยไปที่ "My Network Places" แล้วเลือก "Add a network place" (จากตัวเลือกใต้ "Network Tasks" ด้านซ้าย) แล้วป้อน URL เป็น http://b.com/dav มันจะถามให้ใส่ Login/Password แต่เมื่อกรอกไปแล้ว จะถูกด่ากลับมาว่ารหัสไม่ถูกต้อง และชื่อ Login จะถูกเปลี่ยนไป เป็น b.com\login เช่น ป้อนไปว่า "vuthi" มันจะถามมาใหม่เป็น "b.com\vuthi"

"b.com\vuthi" คือ Login name ที่ Windows XP ส่งไปให้ Apache Apache ก็เลยตรวจรหัสผ่านไม่เจอ ไม่ถูกต้อง เพราะไม่มีชื่อนี้ในไฟล์ /path/to/httpauth.txt ลองไปสร้างดูแล้วก็ไม่สำเร็จ

ค้น Google มีคนบอกให้เอา mod_encoding มาใช้ จะแก้ปัญหานี้ได้ ลองดูหลายรอบ ไม่สำเร็จ ปัญหาไม่หาย

สุดท้ายไปเจอว่า ต้องระบุหมายเลขพอร์ต 80 ใน URL ด้วย คือ ให้ใช้ http://b.com:80/dav แทน ในกรณีนี้ Windows XP จะส่งชื่อไปแค่ "vuthi" สามารถ Login ได้เรียบร้อยดี สุดท้ายก็จะได้ "dav on b.com" โผล่ขึ้นมาใน "My Network Places" ให้เรียกใช้เมื่อต้องการ

มีหมายเลขพอร์ตกับไม่มีมันต่างกันตรงไหน ? ไปดูที่ Log ไฟล์ของ Apache จะเห็นว่า

  • ถ้าไม่ระบุพอร์ต 80: User-Agent จะเป็น Microsoft-WebDAV-MiniRedir /5.1.2600
  • ถ้าระบุพอร์ต 80: User-Agent จะเป็น Microsoft Data Access Internet Publishing Provider Protocol Discovery
คงเป็นคนละโมดูล ทำงานไม่เหมือนกัน

เขาว่ากันว่า Windows 2000 ไม่มีปัญหานี้ ไม่มีการเติม Domain หน้า Login ให้เอง ถึงแม้จะไม่ระบุหมายเลขพอร์ต

No comments: