图像不会通过Web服务器显示在网页上

时间:2015-10-26 20:28:08

标签: html macos http common-lisp relative-path

我正在尝试在Mac OS X(10.9.5)上的本地主机http://127.0.0.1:8080/上显示HTML页面,但不显示图像。 我在Common Lisp中有一个非常粗鲁的程序,充当web服务器,它只是监听HTML页面并将其输出到套接字8080。 HTML页面(在剥离其他所有内容之后)只是:

<html>
  <head>
  </head>
  <body>This is a test
    <img src="/Users/John/bs/images/MyImage.png"/>
  </body>
</html>

当我在浏览器的URL中写http://127.0.0.1:8080/时(我尝试过FF和Safari),页面显示但没有图像。 我试图以所有可以想象的方式(./../bs/images/MyImage.png等)将img路径从绝对路径更改为相对路径,但无济于事。 HTML页面位于/Users/John/bs/index.html。充当服务器的程序位于同一目录中。 如果我直接从URL栏打开页面,请文件:///Users/John/bs/index.html它可以正常工作,显示图像。 我不知道这是来自主机根目录的相对路径问题(我忽略了它的位置),或浏览器通过Web服务器访问页面的问题。 以下是Lisp代码的片段:

(defun serve (request-handler)
  (let ((socket (socket-server 8080)))
    (unwind-protect
       (loop (with-open-stream (stream (socket-accept socket))
                 (let* ((url    (parse-url (read-line stream)))
                        (path   (car url))
                        (header (get-header stream))
                        (params (append (cdr url) 
                                        (get-content-params stream header)))
                        (*standard-output* stream))
                   (funcall request-handler path header params))))
       (socket-server-close socket))))

(defun request-handler (path header params)
   (princ "HTTP/1.1 200 OK")
   (terpri)
   (terpri)
   (with-open-file (in "bs/index.html")
      (copy-stream in *standard-output*)))

(serve #'request-handler)

有没有人有同样的问题?感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

当您的浏览器与您的Web服务器(您编写的代码)联系时,任何不以&#34;方案&#34;开头的链接(通常&#34; http://&#34;或&#34; https://&#34;)并且主机名将被视为相对于所获取的页面。这意味着您的浏览器将向同一服务器发送请求以获取资源&#34; /Users/John/bs/images/MyImage.png"除非您的服务器可以通过流发回图像,否则它将在页面上显示为损坏的图像。

微不足道的修补程序(可让它在您的计算机上运行)是将图像URL更改为&#34; file:// localhost // Users / John / bs / images / MyImage .png&#34;,但这是错误的修复。正确的解决方法是在请求的路径上分派并在需要时提供基本HTML页面,或在需要时提供图像。

答案 1 :(得分:0)

尝试以下方法。相对路径应该相对于调用图像的文件,因此您不希望一直回到/ Users / John。

<img src="images/MyImage.png"/>
相关问题