簡體   English   中英

Appengine-部署隱藏文件夾

[英]Appengine - Deployment of hidden folder

要驗證SSL證書,我需要將一個包含一些文件的隱藏文件夾(“ /.well-known”上傳到我的應用程序中)。

我正在用Eclipse部署Java應用程序,但是appengine上的應用程序未收到這些文件。 我猜他們被過濾掉了。

我試圖將隱藏的文件夾作為靜態文件添加到appengine-web.xml,但這沒有幫助。

<!-- Configure serving/caching of GWT files -->
<static-files>
    <include path="**" />
    <include path=".**" />
    <include path="**.*" expiration="0s" />
    <include path="**.well-known" expiration="0s" />
    <include path="**.nocache.*" expiration="0s" />
    <include path="**.cache.*" expiration="365d" />
    <include path="**.css" expiration="30d"/>
    <exclude path="**.gwt.rpc" />
    <exclude path="**.html" />
</static-files>

有什么想法可以上傳這些文件夾和文件嗎?

對於嘗試在Google App Engine中以靜態方式為letencrypt解決挑戰而失敗的其他人(例如我),以下是對我有用的:(一個人可能可以靜態地進行,但是我沒有嘗試它是因為我不想花更多的時間來嘗試一些東西,而Ian顯然嘗試了這一點,並且無法使它起作用[也許在Google App Engine內部完成的copy命令忽略了以點開頭的目錄])

摘錄自http://igorartamonov.com/2015/12/lets-encrypt-ssl-google-appengine/ ,版權歸Igor Artamonov所有。

只需構建一個像這樣的servlet:

公共類LetsencryptServlet擴展HttpServlet {

    public static final Map<String, String> challenges = new HashMap<String, String>();

    static {
        challenges.put("RzrvZ9gd7EH3i_TsJM-B0vdEMslD4oo_lwsagGskp6c",
                "RzrvZ9gd7EH3i_TsJM-B0vdEMslD4oo_lwsagGskp6c.ONrZa3UelibSWEX270nTUiRZKPFXw096nENWbMGw0-E");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        if (!req.getRequestURI().startsWith("/.well-known/acme-challenge/")) {
            resp.sendError(404);
            return;
        }
        String id = req.getRequestURI().substring("/.well-known/acme-challenge/".length());
        if (!challenges.containsKey(id)) {
            resp.sendError(404);
            return;
        }
        resp.setContentType("text/plain");
        resp.getOutputStream().print(challenges.get(id));
    }
}

並添加到web.xml這樣的東西:

<servlet>
    <servlet-name>letsencrypt</servlet-name>
    <servlet-class>...LetsencryptServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>letsencrypt</servlet-name>
    <url-pattern>/.well-known/acme-challenge/*</url-pattern>
</servlet-mapping>

當然,請確保Servlet類具有所創建Servlet的完整類路徑。

該博客文章還介紹了生成和安裝證書所需的其他步驟。

伊恩:確定要很好地部署servlet嗎? 檢查日志,確保您正在測試正確的版本..也許您遇到了編譯問題..

干杯

我在嘗試提供assetlinks.json文件時遇到了這個問題。 確實確實出現了以。開頭的文件夾。 在App Engine的靜態上下文中不可訪問。 JoãoAntunes解決方法的更通用版本如下。

首先,創建不帶的文件夾。 在開始時,將所有需要的文件放入其中。

然后,我們需要創建一個servlet,當收到對隱藏文件夾的請求時,它將使用正確的數據進行響應。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Will Calderwood on 17/05/2017.
 * <p>
 * It would appear to not be possible to upload hidden folders to app engine. So when files need
 * to be served from a hidden folder the URL can be bounced through this servlet
 */
public class StaticFileServer extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // We'll remove the dots from the path
        String uri = req.getRequestURI().replace("/.", "/");

        // Do anything else that needs doing here
        if (uri.toLowerCase().contains(".json")) {
            resp.setContentType("application/json");
        }

        // Read and return the resource from the non-hidden folder
        try (InputStream in = getServletContext().getResourceAsStream(uri)) {
            if (in == null){
                resp.sendError(404);
                return;
            }
            byte[] buffer = new byte[8192];
            int count;
            while ((count = in.read(buffer)) > 0) {
                resp.getOutputStream().write(buffer, 0, count);
            }
        }
    }
}

然后將以下內容添加到您的web.xml文件中,以將隱藏的文件夾指向我們的servlet。

<servlet>
    <servlet-name>StaticFileServer</servlet-name>
    <servlet-class>main.com.you.StaticFileServer</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>StaticFileServer</servlet-name>
    <url-pattern>/.well-known/*</url-pattern>
</servlet-mapping>

靜態文件不會上載到應用程序服務器,因此無法通過應用程序代碼訪問。 appengine-web.xml參考中的<static-files>部分中:

<靜態文件>

可選的。 <static-files>元素指定與文件路徑相匹配的模式,以包括或排除靜態文件列表,覆蓋或修改默認行為。 靜態文件由與應用程序服務器不同的專用服務器和緩存提供,對於提供靜態內容(例如圖像,CSS樣式表或JavaScript文件)很有用。

要使文件可通過應用程序代碼訪問,需要在<resource-files>部分(與上述相同的文檔)中指定它們:

<資源文件>

可選的。 應用程序代碼可以使用文件系統訪問<resource-files>元素中列出的文件。 這些文件與應用程序一起存儲在應用程序服務器上,與靜態文件的存儲和提供方式相反。

我嘗試了所有操作,但是無法上傳該隱藏文件夾。 然后,我為該路徑定義了一個Servlet映射,該Servlet會寫出SSL發行方期望的驗證字符串:

<servlet-mapping>
    <servlet-name>SSLVerificationServlet</servlet-name>
    <url-pattern>/.well-known/acme-challenge/roQH_vUmRQsuKH8lZGedft9O6TK-UoZWzv_kY8MukH4F8</url-pattern>
</servlet-mapping> 

我確實找到了一種更好的方法,問題是代碼存儲在隱藏目錄中,因此我們只需要將正確的url映射到可見目錄即可。

handlers: - url: /.well-known static_dir: _well-known

一個丑陋但簡單的解決方法是使用JSP支持來映射頁面。 一個例子:

package/src/main/webapp/_well-known/assetlinks.json.jsp創建您的json文件

<%@ page contentType="application/json;charset=UTF-8" language="java"%>
[JSON CONTENT]

將“ servlet”映射到web.xml的所需路徑:

<servlet>
    <servlet-name>Asset Links</servlet-name>
    <jsp-file>/_well-known/assetlinks.json.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>Asset Links</servlet-name>
    <url-pattern>/.well-known/assetlinks.json</url-pattern>
</servlet-mapping>

做完了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM