2017-10-05 10 views
-1

다음은 내 HTML 템플릿을 표시하는 기능입니다. 나는 최근에 내 블로그 페이지에서 일을 시작했는데 어떤 이유로 내 첫 번째 및 두 번째 "else if"문이 부딪치지 않습니다. :내 URL.Path 문이 맞지 않는 이유는 무엇입니까

func handleRequest(w http.ResponseWriter, r *http.Request) { 
    templates := populateTemplates() 
    // present home.html if the request url is "/" 
    if r.URL.Path == "/" { 
     t := templates.Lookup("home.html") 
     t.Execute(w, nil) 
    } else if r.URL.Path == "blog/" { 
     posts := getPosts() 
     t := template.New("blog.html") 
     t, _ = t.ParseFiles("blog.html") 
     t.Execute(w, posts) 
     return 
    } else if r.URL.Path == "blog/*" { 
     f := "blog/" + r.URL.Path[1:] + ".md" 
     fileread, _ := ioutil.ReadFile(f) 
     lines := strings.Split(string(fileread), "\n") 
     status := string(lines[0]) 
     title := string(lines[1]) 
     date := string(lines[2]) 
     summary := string(lines[3]) 
     body := strings.Join(lines[4:len(lines)], "\n") 
     htmlBody := template.HTML(blackfriday.MarkdownCommon([]byte(body))) 
     post := Post{status, title, date, summary, htmlBody, r.URL.Path[1:]} 
     t := template.New("_post.html") 
     t, _ = t.ParseFiles("_post.html") 
     t.Execute(w, post) 
    } else { 
     requestedFile := r.URL.Path[1:] 
     t := templates.Lookup(requestedFile + ".html") 
     if t != nil { 
      err := t.Execute(w, nil) 
      if err != nil { 
       log.Println(err) 
      } 
     } else { 
      w.WriteHeader(http.StatusNotFound) 
     } 
    } 
} 
+5

URL 경로는 슬래시로 시작합니다. – Peter

+4

또한이'if r.URL.Path == "blog/*"'... 만약'=='이 당신을 위해 정규 표현식 매칭을한다면 당신은 틀렸다고 가정한다면, 다른 한편으로는 그런 종말점은 나를 무시합니다. – mkopriva

+1

if 앞에는'r.URL.Path'가 출력되지 않습니다. –

답변

1

문제를 가정하면 블로그 URL을, 당신은 대신을 시도 할 수 :

if r.URL.Path == "/" { 
... 
} else if r.URL.Path == "/blog" { 
... 
} else if strings.HasPrefix(r.URL.Path,"/blog/") { 
....  
} else { 

을 내가 templates.Lookup 어떤 파일 시스템 호출을하지 않습니다 바라고 있어요, 아마 그냥 보이는 지도에서 그들을 위로. 또한

,이 작업을 수행하지 않습니다 [1 :] "../mysecretfile"이고 당신이 일치하는 파일을 가지고 r.URL.Path이 경우 어떤 일이 일어날 것이라고

f := "blog/" + r.URL.Path[1:] + ".md" 
fileread, _ := ioutil.ReadFile(f) 

? 외부 문자열을 path.Clean 등으로 정리하지 않고 사용하는 것은 좋지 않습니다.

+0

Kenny, 고맙습니다. 나는 그 URL 경로로 문서를 잘못 읽었고, 나는 그 문서가 옳았음을 확신했다. :/다른 조언에 대해, 고마워, 이건 내가 처음으로 웹 개발 프로젝트인데, 어떤 조언을 많이 받았다. . – FishFenly

+0

문제 없습니다. 다행 이군. –