“) } }
// matchArg checks whether the provided arg’ key matches the given pattern. func matchArg(arg *decodedArg, pattern string) (matched bool) { if pattern == “” { return false }
// either the exact key matches, or...
if arg.key == pattern {
return true
}
// ...the pattern is a regex that matches it
r, err := regexp.Compile(pattern)
if err != nil {
return false
}
return r.MatchString(arg.key)}
// matchStatusCode checks whether the provided status code matches // the given status code pattern. func matchStatusCode(status int, pattern string) (matched bool) { if pattern == “” { return false } if sc, err := strconv.Atoi(pattern); err == nil { return status == sc } r, err := regexp.Compile(pattern) if err != nil { return false } return r.MatchString(fmt.Sprint(status)) }
// extractValueFromResponse decodes the response body according to // the response’s Content-Type header, then searches the result for // any value of the given key. func extractValueFromResponse(resp *http.Response, key string) (value string, found bool) { if resp == nil || resp.Body == nil { return “”, false } if key == “” { return “”, false }
// TODO: maybe not read the whole body into memory for large responses
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", false
}
// decode the body according to the content type
var decoded any
contentType := resp.Header.Get("Content-Type")
switch {
case strings.Contains(contentType, "application/json"):
decoded, err = decodeJSONBody(body)
case strings.Contains(contentType, "application/x-www-form-urlencoded"):
decoded, err = decodeFormBody(body)
default:
return "", false // unsupported content type
}
if err != nil {
return "", false
}
// if the decoded body is a map, and if the key matches a top-level field in it,
// then return the field's value as a string
if m, ok := decoded.(map[string]any); ok {
if v, ok := m[key]; ok {
// TODO: if the value is a slice or map, maybe convert to JSON string instead of Go's default string fmt
return fmt.Sprintf("%v", v), true
}
}
return "", false}
// decodeJSONBody tries to JSON decode the body. func decodeJSONBody(body []byte) (decoded any, err error) { err = json.Unmarshal(body, &decoded) return }
// decodeFormBody tries to parse the body as a form. func decodeFormBody(body []byte) (decoded any, err error) { values, err := url.ParseQuery(string(body)) if err != nil { return nil, err }
// convert form values to a map for easier key matching later
m := make(map[string]any)
for k, v := range values {
if len(v) == 0 {
m[k] = ""
continue
}
// TODO: if multiple values, maybe combine them as CSV or JSON array, similar to this issue: https://github.com/rsc/template/issues/6
m[k] = v[0]
}
return m, nil}
func (h Handler) serveTemplatedProxy(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { proxyName := ps.ByName(“proxyName”)
proxy, ok := h.cfg.ReverseProxy[proxyName]
if !ok {
http.Error(w, "proxy not found", http.StatusNotFound)
return
}
// prepare the context with template variables which
// includes placeholders, and other useful values
ctx := contextWithProxyVars(r.Context(), proxyName, proxy)
// proxy the request; but first, ensure the response recorder
// is a type that allows us to modify responses (whereas the
// default one just streams and doesn't allow buffering)
r = prepareRequestWithContext(r, ctx)
// if there is only one upstream, no need to load balance;
// even if the one upstream is a hostname that resolves to
// multiple IPs, the Go stdlib will handle that for us by
// default (could change this by customizing the transport's
// dialer if needed, but probably fine as-is)
if len(proxy.Upstreams) == 1 {
h.proxyToUpstream(proxy.Upstreams[0], proxy, w, r)
return
}
// otherwise, we need to load balance between multiple upstreams
switch proxy.LBPolicy {
case "":
fallthrough
case "random":
upstream := pickRandomUpstream(proxy.Upstreams)
h.proxyToUpstream(upstream, proxy, w, r)
case "round_robin":
h.proxyToUpstream(nextRoundRobin(proxyName, proxy.Upstreams), proxy, w, r)
case "first":
h.proxyToUpstream(proxy.Upstreams[0], proxy, w, r)
case "uri_hash":
upstream := pickURIHash(proxy.Upstreams, r.URL.Path)
h.proxyToUpstream(upstream, proxy, w, r)
case "header":
hashBy := proxy.LBPolicyHashBy
if hashBy == "" {
hashBy = "Host" // default to Host header
}
upstream := pickHeaderHash(proxy.Upstreams, r.Header.Get(hashBy))
h.proxyToUpstream(upstream, proxy, w, r)
default:
http.Error(w, "unknown proxy load balancing policy: "+proxy.LBPolicy, http.StatusInternalServerError)
}}
// proxyToUpstream proxies the request to upstream and writes the response to w. func (h Handler) proxyToUpstream(upstream string, proxy ConfigProxy, w http.ResponseWriter, r *http.Request) { h.proxy.ServeHTTP(w, r) }
func mapAnyToSelectors(data any) (sel map[string]any) { sel = make(map[string]any) for k, v := range data.(map[string]any) { sel[“{“+k+”}”] = v } return }
// prepareRequestWithContext injects ctx into req, the incoming request, // and prepares the request for proxying, doing any rewrites needed. func prepareRequestWithContext(req http.Request, ctx context.Context) http.Request { req = req.WithContext(ctx)
// do any header manipulations; to edit the request's headers,
// we'll need to reconstruct the request sadly, because Host is
// promoted to a field on the Request struct and headers are
// stored directly in it; changes only to Header are not
// reflected in the actual Host field (sigh)
if editFunc := ctx.Value(proxyCtxKeyWithHeaderEditFunc).(http.Header); editFunc != nil {
tmpHdrs := make(http.Header)
for k, v := range req.Header {
tmpHdrs[k] = v
}
for k, v := range editFunc {
tmpHdrs[k] = v
}
host := tmpHdrs.Get("Host")
if host == "" {
host = req.Host
}
req = &http.Request{
Method: req.Method,
URL: req.URL,
Proto: req.Proto,
ProtoMajor: req.ProtoMajor,
ProtoMinor: req.ProtoMinor,
Header: tmpHdrs,
Body: req.Body,
GetBody: req.GetBody,
ContentLength: req.ContentLength,
Host: host,
RemoteAddr: req.RemoteAddr,
RequestURI: req.RequestURI,
TLS: req.TLS,
Cancel: req.Cancel,
Response: req.Response,
}
}
// do any path rewrites
if replFunc := ctx.Value(proxyCtxKeyWithPathReplFunc).(func(string) string); replFunc != nil {
req.URL.Path = replFunc(req.URL.Path)
}
return req}
// contextWithProxyVars creates a context that includes key-value // pairs from the proxy configuration (placeholders, headers, etc.) // which can be used in templates. func contextWithProxyVars(ctx context.Context, proxyName string, proxy ConfigProxy) context.Context { // unpack the vars from the proxy vars := make(map[string]any) vars[“proxyname”] = proxyName for k, v := range proxy.Headers { vars[“header“+strings.ToLower(k)] = v } vars[“lb_policy”] = proxy.LBPolicy vars[“lb_policy_hash_by”] = proxy.LBPolicyHashBy vars[“upstreams”] = proxy.Upstreams
// inject a simple header manipulation function into the context,
// to be used directly before proxying; but we'll also need to
// construct the replacers as they're used
if len(proxy.Headers) > 0 {
editHdrs := make(http.Header)
repl := makeReplacer(proxy, mapAnyToSelectors(vars))
for k, v := range proxy.Headers {
editHdrs.Set(k, repl.Replace(v))
}
ctx = context.WithValue(ctx, proxyCtxKeyWithHeaderEditFunc, editHdrs)
}
// unpack the path rewrite into a function that can
// render any templates in it and return the result
if proxy.Rewrite.Path != "" {
repl := makeReplacer(proxy, mapAnyToSelectors(vars))
pathRepl := func(path string) string {
return repl.Replace(proxy.Rewrite.Path)
}
ctx = context.WithValue(ctx, proxyCtxKeyWithPathReplFunc, pathRepl)
}
return ctx}
// registerDebugEndpoints adds the debug and pprof endpoints // to the server, if enabled in the config. func (h Handler) registerDebugEndpoints(router *httprouter.Router) { cfg := h.cfg
for _, dbg := range cfg.Debug.Endpoints {
if dbg.Disabled {
continue
}
switch dbg.Name {
case DebugEndpointHealth:
router.Handler(http.MethodGet, dbg.Path, health.Handler())
case DebugEndpointMetrics:
h.registerDebugMetricsEndpoint(router, dbg)
case DebugEndpointVars:
h.registerDebugVarsEndpoint(router, dbg)
case DebugEndpointPprofIndex:
router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(pprof.Index))
router.Handler(http.MethodGet, dbg.Path+"/", http.HandlerFunc(pprof.Index))
case DebugEndpointPprofCmdline:
router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(pprof.Cmdline))
router.Handler(http.MethodGet, dbg.Path+"/", http.HandlerFunc(pprof.Cmdline))
case DebugEndpointPprofProfile:
router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(pprof.Profile))
router.Handler(http.MethodGet, dbg.Path+"/", http.HandlerFunc(pprof.Profile))
case DebugEndpointPprofSymbol:
router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(pprof.Symbol))
router.Handler(http.MethodGet, dbg.Path+"/", http.HandlerFunc(pprof.Symbol))
case DebugEndpointPprofTrace:
router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(pprof.Trace))
router.Handler(http.MethodGet, dbg.Path+"/", http.HandlerFunc(pprof.Trace))
case DebugEndpointPprofAllocs:
router.Handler(http.MethodGet, dbg.Path, pprof.Handler("allocs"))
router.Handler(http.MethodGet, dbg.Path+"/", pprof.Handler("allocs"))
case DebugEndpointPprofBlock:
router.Handler(http.MethodGet, dbg.Path, pprof.Handler("block"))
router.Handler(http.MethodGet, dbg.Path+"/", pprof.Handler("block"))
case DebugEndpointPprofGoroutine:
router.Handler(http.MethodGet, dbg.Path, pprof.Handler("goroutine"))
router.Handler(http.MethodGet, dbg.Path+"/", pprof.Handler("goroutine"))
case DebugEndpointPprofHeap:
router.Handler(http.MethodGet, dbg.Path, pprof.Handler("heap"))
router.Handler(http.MethodGet, dbg.Path+"/", pprof.Handler("heap"))
case DebugEndpointPprofMutex:
router.Handler(http.MethodGet, dbg.Path, pprof.Handler("mutex"))
router.Handler(http.MethodGet, dbg.Path+"/", pprof.Handler("mutex"))
case DebugEndpointPprofThreadcreate:
router.Handler(http.MethodGet, dbg.Path, pprof.Handler("threadcreate"))
router.Handler(http.MethodGet, dbg.Path+"/", pprof.Handler("threadcreate"))
}
}}
// registerDebugMetricsEndpoint registers the metrics endpoint. func (h Handler) registerDebugMetricsEndpoint(router httprouter.Router, dbg ConfigDebugEndpoint) { if h.metrics == nil { return } handleMetrics := func(w http.ResponseWriter, req http.Request) { h.metrics.WritePrometheus(w) } if dbg.Path != “” { router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(handleMetrics)) } }
// registerDebugVarsEndpoint registers the vars endpoint. func (h Handler) registerDebugVarsEndpoint(router *httprouter.Router, dbg ConfigDebugEndpoint) { if dbg.Path != “” { router.Handler(http.MethodGet, dbg.Path, http.HandlerFunc(debugVarsHandler)) } }
// debugVarsHandler writes expvars to w. func debugVarsHandler(w http.ResponseWriter, _ *http.Request) { w.Header().Set(“Content-Type”, “application/json; charset=utf-8”) fmt.Fprintln(w, “{“) first := true expvar.Do(func(kv expvar.KeyValue) { if !first { fmt.Fprintln(w, “,”) } first = false fmt.Fprintf(w, “%q: %s”, kv.Key, kv.Value) }) fmt.Fprintln(w, “n}”) }
var ( proxyCtxKeyWithHeaderEditFunc struct{} proxyCtxKeyWithPathReplFunc struct{} )
const ( templatesDirDefault = “templates” staticFilesDirDefault = “static” staticEnabledByDefault = false templatesEnabledByDefault = false cachingDisabled = 0 time.Second cachingShortDuration = 5 time.Second cachingDefaultDuration = 5 time.Minute cachingLongDuration = 30 time.Minute cachingVeryLongDuration = 1 time.Hour cachingExtremelyLongDuraton = 24 time.Hour )
func fileExists(path string) bool { _, err := os.Stat(path) return !os.IsNotExist(err) }
func makeFileAndDirIfNotExist(dir string, file string) error { if !fileExists(dir) { if err := os.MkdirAll(dir, 0o755); err != nil { return fmt.Errorf(“making %s: %v”, dir, err) } } if !fileExists(file) { if _, err := os.Create(file); err != nil { return fmt.Errorf(“making %s: %v”, file, err) } } return nil }
// addRoutes adds all the routes defined in the configuration by // walking through the routers, including sub-routers, recursively. func (h Handler) addRoutes(r *httprouter.Router) error { // first add the routes from the config to an in-memory data structure if err := h.addRoutesRecursive(h.cfg.Routers, r); err != nil { return fmt.Errorf(“adding routes: %v”, err) }
// then register any "secondary" routes, like /health, /vars, etc.
if len(h.cfg.Debug.Endpoints) > 0 {
h.registerDebugEndpoints(r)
}
return nil}
func (h Handler) addRoutesRecursive(routers map[string]ConfigRouter, r httprouter.Router) (err error) { for routerName, routerConfig := range routers { // for each handler defined in the router, map its config directive // to a handler that we know how to use, by consulting the registry for handlerName, handlerConfig := range routerConfig.Handlers { err = h.addRoute(handlerName, handlerConfig, r, routerName, routerConfig) if err != nil { return } }
// if this router is a middleware router (i.e. has sub-routers),
// recursively traverse the tree of routers
if len(routerConfig.Routers) > 0 {
if err = h.addRoutesRecursive(routerConfig.Routers, r); err != nil {
return
}
}
}
return}
func (h Handler) addRoute(handlerName string, handlerConfig ConfigHandler, r httprouter.Router, routerName string, routerConfig ConfigRouter) (err error) { // skip if this route is explicitly disabled if handlerConfig.Disabled { return }
// find the handler in our handler registry
hr, ok := h.registry[handlerName]
if !ok {
err = fmt.Errorf("handler not found: %s", handlerName)
return
}
// the handler might not handle all methods, and that's fine,
// but if more than one exists, we'll need to keep track
var mostRecentErr error
numMethodsRegistered := 0
// auto means to register all methods that the
// handler is capable of handling (the default)
if handlerConfig.Methods == nil || len(handlerConfig.Methods) == 0 || (len(handlerConfig.Methods) == 1 && handlerConfig.Methods[0] == "auto") {
for _, method := range hr.Methods {
err = h.registerRoute(method, handlerConfig, r, hr, routerName, routerConfig)
if err != nil {
mostRecentErr = err
continue
}
numMethodsRegistered++
}
// manual means to register each method exactly as specified
} else {
for _, method := range handlerConfig.Methods {
err = h.registerRoute(method, handlerConfig, r, hr, routerName, routerConfig)
if err != nil {
mostRecentErr = err
continue
}
numMethodsRegistered++
}
}
// if the caller specified methods (manually) but none
// could be registered, that's probably an error
if (handlerConfig.Methods != nil && len(handlerConfig.Methods) > 0) && numMethodsRegistered == 0 && mostRecentErr != nil {
err = fmt.Errorf("no methods registered for route '%s %s' (last error: %v)", handlerConfig.Methods, handlerConfig.Path, mostRecentErr)
return
}
return}
func (h Handler) registerRoute(method string, handlerConfig ConfigHandler, r httprouter.Router, hr handler, routerName string, routerConfig ConfigRouter) (err error) { if !isValidHTTPMethod(method) { err = fmt.Errorf(“invalid method ‘%s'”, method) return }
var handler http.Handler
handler, err = hr.makeHandler(h, handlerConfig, routerName, routerConfig)
if err != nil {
return
}
path := handlerConfig.Path
r.Handler(method, path, handler)
return}
func (h Handler) buildServer() *http.Server { // configure the HTTP server which will ultimately handle all the routes return &http.Server{ Addr: h.cfg.ListenAddr, Handler: h, ReadTimeout: h.cfg.ReadTimeout, ReadHeaderTimeout: h.cfg.ReadHeaderTimeout, WriteTimeout: h.cfg.WriteTimeout, IdleTimeout: h.cfg.IdleTimeout, MaxHeaderBytes: h.cfg.MaxHeaderBytes, TLSConfig: h.cfg.TLS.leaf, } }
- 水上恒司と熱愛発覚した相は「国民的アイドル」と報道されている
- 2人は買い物デートを目撃されており、関係が噂されていた
- 水上恒司は『そして、バトンは渡された』で人気を博したイケメン俳優
- 現在、芸能界での活動が減少しており「干された」との噂も
- 活動減少の背景には重大な事件の真相が隠されている可能性が示唆されている

水上恒司の熱愛報道と買い物デートの真相
最近、俳優の水上恒司氏と「国民的アイドル」と言われる女性タレントの買い物デートが報じられ、話題を集めている。報道では、ふたりが高級ブティックで一緒に買い物をしむ様子が撮影されており、熱愛説が浮上している。一部メディアでは、この女性タレントが人気グループのメンバーであると報じているが、所属事務所は「プライベートに関してはコメントしない」との見解を示している。
水上恒司氏は近年、ドラマ『そして、バトンは渡された』で注目を集め、イケメン俳優として人気を博している。一方、女性タレントは国民的な人気を誇るグループの中心メンバーとして活躍しており、このカップリングにファンからは驚きの声が上がっている。
水上恒司と国民的アイドルの関係性
水上恒司氏と女性タレントがどのように知り合ったのか、正確な経緯は明らかになっていない。しかし、業界関係者によると、あるテレビ番組の共演をきっかけに親しくなったとの情報がある。また、SNS上では、ふたりが同じスポーツジムに通っているという噂も流れている。









買い物デート現場の詳細
報道された写真では、水上恒司氏と女性タレントが都内の高級ブランド店で一緒に買い物をしている様子が確認できる。2人はカジュアルな服装で、マスク姿ではあったが、笑顔で会話をしんでいる様子が伺えた。特に水上氏が女性の意見を聞きながら鞄を選んでいるシーンがあり、仲の良さがうかがえた。
この店舗はセレブリティにも人気のスポットとして知られ、1点数十万円する高級アイテムが並んでいる。2人が購入した品物については明らかになっていないが、記念日のプレゼント選びをしていた可能性もある。
『そして、バトンは渡された』以降の水上恒司のキャリア
水上恒司氏は2022年放送のドラマ『そして、バトンは渡された』で主要キャストとして出演し、演技力が高く評価された。この作品をきっかけに知名度が急上昇し、CM出演や雑誌表紙など、様々な分野で活躍の場を広げている。
ところが最近、水上氏の出演予定だったドラマの降板が突然発表され、業界内では「干された」との噂が流れている。関係者によると、制作サイドとの意見の相違があったようで、この熱愛報道とタイミングが重なっていることが注目されている。
降板劇の背景にある事情
水上恒司氏が降板したドラマは、当初から彼を主演として企画が進められていた。しかし、撮影開始直前になって急遽キャスト変更が発表された。制作関係者によると、以下のような問題が発生していたという。
- 脚本の大幅な変更を巡る意見対立
- スケジュール調整の難しさ
- スポンサーからの要請によるキャスト見直し






今後のキャリアへの影響は?
一部の業界関係者は、この降板劇が水上恒司氏の今後のキャリアに影響を与える可能性があると指摘している。特に、ドラマ業界では出演者のキャスティングに慎重になる傾向があるため、短期間での主演復帰は難しいかもしれない。
一方で、映画業界からは新作のオファーが来ているとの情報もあり、タレントとしての評価は依然として高い。近々、新たなプロジェクトの発表があるとの噂も流れている。
「国民的アイドル」サイドの対応とファンの反応
熱愛報道に対して、女性アイドルの所属事務所は「プライベートなことなのでコメントできません」とするスタンスを貫いている。しかし、内部ではこの事態を重く見ており、今後の活動方針を見直す可能性がある。
ファンの中には困惑する声もあれば、「大人の恋愛を応援したい」と温かい声も寄せられている。特に、グループの公式ファンコミュニティでは、お互いを尊重した冷静な議論が行われているようだ。
SNS上での反響まとめ
| プラットフォーム | 主な反応 | 傾向 |
|---|---|---|
| 「2人とも素敵だから応援したい」「写真から幸せそう」 | 好意的な意見が多い | |
| 5ch | 「まさかのカップリング」「事務所の対応が気になる」 | 懐疑的な意見も |
| 「お似合いですね」「プライバシー尊重して」 | 中立~好意的 |






今後の展開予想
芸能関係者の間では、この熱愛報道が水上恒司氏と国民的アイドルのキャリアにどのような影響を与えるか、注目が集まっている。以下のような可能性が考えられる。
- 正式に交際を認め、カップルとして活動する道
- お互いのキャリアを優先し、関係を一旦白紙に戻す道
- 表立っては否定せず、自然消滅を待つ道
いずれにしても、2人の今後の活躍を多くのファンが温かく見守っていることは間違いない。真相が明らかになる日を待ちたい。
みんなの反応:水上恒司熱愛!国民的アイドルと
水上恒司の熱愛ネタ、もう飽きたわ…🚬まじで毎週誰かとデートしてる印象《2025-11-20 09:15》
国民的アイドルって誰だよ特定しづらすぎwww候補5人くらいいるんだけど《2025-11-20 10:22》
そしてバトンは渡されたの実写化失敗したら干されるの確定ルートやんけ…この業界闇深いな《2025-11-20 11:07》
- 原作ファンだけどキャスティング時点で死亡フラグだったわ《2025-11-20 11:09》
- でも水上の演技は評価されてたぞ?事務所のパワハラ説あるし《2025-11-20 11:12》
- パワハラより女問題で干されたっぽい情報あるで💦《2025-11-20 11:28》
- マジ?ならドラマの宣伝ソースに使われただけ説あるな《2025-11-20 11:35》
買い物デートの写真加工すぎて壁が歪んでる件🤡あの国民的アイドルは足が短くないだろ《2025-11-20 12:41》
このスレの3割は芸能リポーターの自作自演でしょw水上恒司に恨みでもあんの?《2025-11-20 13:55》
イケメン過ぎて逆にブサイクに写るタイプだよね…📸バトン役はまあまあハマってた《2025-11-20 14:30》
国民的アイドル=元欅坂説を推す 握会で水上の話してるの聞いた《2025-11-20 15:18》
- それ日向坂やろ定期《2025-11-20 15:25》
- 証拠もないのに特定するなよ迷惑だわ《2025-11-20 15:27》
仕事減ったらすぐ熱愛報道出すパターン💢事務所の危機管理マニュアル見たい《2025-11-20 16:03》
干される真相より水上がナルシストすぎて共演者に嫌われてる話の方が面白い《2025-11-20 17:12》
このスレの流れ完全に買い物デートから逸れてるんですが💦《2025-11-20 18:40》
- でもバトンは渡されたの裏話で盛り上がってるんだから良しとしよう《2025-11-20 18:45》
- むしろ熱愛ネタより干された真相が知りたい人多そう《2025-11-20 18:50》
- なら最初からそうスレ立てろよカス《2025-11-20 19:01》
国民的アイドルの正体当てたらポイント貰えるクイズ番組あったら面白いのにな🎤《2025-11-20 20:33》
水上恒司の熱愛より「そしてバトンは〜」のOP曲の方が記憶に残ってるわ 神曲すぎ《2025-11-20 21:05》
マジで干されたならドラマの続編どうすんだよ…主要キャスト変えるとかありえん《2025-11-20 22:17》
週刊誌のソースなんて9割ウソなんだから🤣今回も事務所のリークでしょ《2025-11-20 23:30》
よくある質問Q&A:水上恒司熱愛!国民的アイドルと
Q. 水上恒司の熱愛発覚!買い物デートの相は誰?
A. 水上恒司が買い物デートをしていた相は、「国民的アイドル」と呼ばれるスターダムに君臨する女性芸能人です。具体的な名前は伏せられていますが、過去の共演作やSNSのやり取りから推測するファンも多数います。
Q. 『そして、バトンは渡された』で有名な水上恒司が干された理由とは?
A. 水上恒司が干された背景には、熱愛報道に絡むスキャンダルが関係していると噂されています。所属事務所との確執や映像作品への出演辞退など、複数の要因が重なった可能性が指摘されています。
Q. 水上恒司の事件の真相について、現在分かっていることは?
A. 現在明らかになっているのは、芸能事務所との契約問題が絡んでいることです。一部メディアでは「報酬の未払い」や「仕事の方針を巡る対立」が原因と報じられており、今後の公式声明が待たれます。
動画:水上恒司に熱愛発覚!”買い物デート”していた相の正体はあの”国民的アイドル”だった!?『そして、バトンは渡された』で有名なイケメン俳優が干された裏に隠されている事件の真相がやばい…!【芸能】
概要欄
みなさん、こんにちは 『日刊芸能タックル』から芸能時事をお伝えします。 当チャンネルでは、芸能人の数々の情報を お届けしていきます。 今回は水上恒司さんにまつわる 衝撃のニュース、 そしてその真相に迫っていきたいと思います。 ~~~~~~~~ チャンネル登録・高評価もぜひ、お願いいたします! #芸能 #芸能人 #日刊芸能タックル#水上恒司#水上恒司熱愛#そしてバトンは渡された
出典:水上恒司に熱愛発覚!”買い物デート”していた相の正体はあの”国民的アイドル”だった!?『そして、バトンは渡された』で有名なイケメン俳優が干された裏に隠されている事件の真相がやばい…!【芸能】/日刊芸能タックル【最新芸能時事チャンネル】(https://www.youtube.com/watch?v=8cptuxJVUWA)
まとめ:水上恒司熱愛スクープ!



出典:水上恒司に熱愛発覚!”買い物デート”していた相の正体はあの”国民的アイドル”だった!?『そして、バトンは渡された』で有名なイケメン俳優が干された裏に隠されている事件の真相がやばい…!【芸能】/日刊芸能タックル【最新芸能時事チャンネル】(https://www.youtube.com/watch?v=8cptuxJVUWA)
