HenryQW / Awesome-TTRSS

🐋 Awesome TTRSS, a powerful Dockerised all-in-one RSS solution.
http://ttrss.henry.wang
MIT License
2.44k stars 493 forks source link

[Feature] 子目录反向代理导致打开文章失败的一种修复方法 #345

Closed hywlzx closed 2 years ago

hywlzx commented 2 years ago

该功能能够解决的问题

231

325

ttrss打开文章调用的是Article.js 里面的

openInNewWindow: function (id) {
        /* global __csrf_token */
        App.postOpenWindow("backend.php",
            { "op": "article", "method": "redirect", "id": id, "csrf_token": __csrf_token });

        Headlines.toggleUnread(id, 0);
    },

实际调用了App.js的postOpenWindow方法

postOpenWindow: function(target, params) {
      const w = window.open("");

        if (w) {
            w.opener = null;

            const form = document.createElement("form");

            form.setAttribute("method", "post");
                        // 这里的taget是backend.php
            form.setAttribute("action", App.getInitParam("self_url_prefix") + "/" + target);

            for (const [k,v] of Object.entries(params)) {
                const field = document.createElement("input");

                field.setAttribute("name", k);
                field.setAttribute("value", v);
                field.setAttribute("type", "hidden");

                form.appendChild(field);
            }

            w.document.body.appendChild(form);
            form.submit();
        }

   }

可以看到表单发出的请求是根据self_url_prefix拼接的 而反向代理使用了子目录的self_url_prefix配置是不能将子目录写进去的 例如 想通过 rss.example.com/ttrss/ 访问 self_url_prefix需要设置为rss.example.com nginx具体配置可以参考文档 所以就导致了打开文章跳转的是 rss.example.com/backend.php 不会匹配到nginx的子目录中 所以访问失败 App.js里面还有一个方法也是类似的

postCurrentWindow: function(target, params) {
      const form = document.createElement("form");

      form.setAttribute("method", "post");
      form.setAttribute("action", App.getInitParam("self_url_prefix") + "/" + target);

      for (const [k,v] of Object.entries(params)) {
         const field = document.createElement("input");

         field.setAttribute("name", k);
         field.setAttribute("value", v);
         field.setAttribute("type", "hidden");

         form.appendChild(field);
      }

      document.body.appendChild(form);

      form.submit();

      form.parentNode.removeChild(form);
   }

这个方法注销的时候会用到 也是会有同样的问题

现在的修改方法就是直接下载App.js到服务器 将form.setAttribute("action", App.getInitParam("self_url_prefix") + "/" + target);· 修改为form.setAttribute("action", App.getInitParam("self_url_prefix") + "/ttrss(子目录路径)/" + target);· 然后docker-compose 添加文件映射

volumes:
  - ./App.js:/var/www/js/App.js:ro

形容理想的解决方案 是否能够有更加方便的修复方案 由于对nginx配置不是太过了解 是否能够通过nginx解决该问题

其他 任何有助于解决方案开发的信息,如:某插件已实现相关功能。

stale[bot] commented 2 years ago

This issue has been automatically marked as stale because it has not had recent activity in 14 days. It will be closed if no further activity occurs in 7 days. Thank you for your contributions.