Да, вы правильно догадались.Файлы / папки, помеченные как статические, обслуживаются отдельно от вашего приложения Go (с использованием сети доставки контента Google) и поэтому не могут знать идентификаторы и состояния сеансов вашего приложения Go.
Это проблема для вас?Обычно статические файлы (например, файлы HTML, CSS и JavaScript) могут быть доставлены без авторизации / аутентификации, они не представляют угрозы безопасности.
Если вы не хотите делать ваши статические файлы «общедоступными»,Вы должны использовать приложение Go, чтобы обслуживать их.Не помечайте их как статические и используйте любой из механизмов обслуживания файлов стандартной библиотеки Go (например, http.FileServer()
, http.ServeFile()
или http.ServeContent()
).Используйте шаблон промежуточного программного обеспечения для проверки существования сеанса, и, если он существует, только после этого вызовите файловый сервер.
(Или реализуйте обслуживание статического контента самостоятельно, и вы можете делать все, что захотите/ need в ваших собственных обработчиках.)
Например, чтобы обслуживать "защищенные" файлы из Go, сопоставленные с /protected
, и иметь некоторые "настоящие" статические файлы (обслуживаемые Google автоматически), сопоставленные с /static
, это может выглядеть так:
app.yaml
:
- url: /protected/.*
script: _go_app
- url: /static
static_dir: static
Тогда в вашем источнике Go вы можете подавать «защищенные» файлы следующим образом:
func init() {
fileHandler := http.StripPrefix("/protected",
http.FileServer(http.Dir("protected")))
http.HandleFunc("/protected/", func(w http.ResponseWriter, r *http.Request) {
// You may check if a session exists here
sessExists := ...
if !sessExists {
http.Error(w, "you must login first", http.StatusUnauthorized)
return
}
// Serve the requested file:
fileHandler.ServeHTTP(w, r)
})
}
Приведенная выше функция init()
регистрирует обработчик, который обрабатывает пути с префиксом /protected/
, и, если сеанс существует (эта логика принадлежит вам), он вызывает файловый сервер, который обслуживает содержимое папки protected
.Обслуживаемый файл получен из пути, префикс /protected
удален.Например, путь /protected/secret.txt
будет обозначать файл protected/secret.txt
.