首页 > 解决方案 > Wordpress - 如何使 URL 返回具有自定义内容类型的动态 JSON?

问题描述

首先是一些背景,我正在尝试按照这里的说明进行操作:

https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW1

获得适用于我的 iOS 设备网站的通用链接。我的 wordpress 站点处于共享托管环境中,因此我无权访问服务器或任何根文件。我将文件放在我网站的根目录(httpdocs),当我导航到该页面时它没有加载。在谷歌搜索中,我发现了一个 stackoverflow 帖子,指出您必须配置服务器以让它知道以“application/pkcs7-mime”的内容类型提供该文件(使用 wordpress 配置 apple-app-site-association 文件) . 如前所述,我无权访问它。

我有一个子域,它是一个我非常熟悉的 microsoft web api 项目。我为“apple-app-site-association”创建了一个端点,并在代码中动态构建了 json 响应并设置了内容类型并返回了它。这最终奏效了,Apple 检测到它和一切。这很有趣,因为我不需要服务器上的文件,因为我动态生成它,而且我不需要更改任何服务器方面的内容。

然而问题是我需要将主站点域作为通用链接,而不是 Windows 子域。主站点是wordpress。我在想是否有可能在 wordpress 中做同样的事情,我导航到 mydomain.com/apple-app-site-association 并即时生成 json 和 content-type 并提供服务。

我从来没有用 wordpress 做过任何编码,甚至不知道从哪里开始。

如果可能的话,我希望在以下方面有明确的方向:

使 mydomain.com/apple-app-site-association 指向提供 json 的自定义函数或页面。拥有使 json 动态提供的代码。具有将响应的内容类型设置为“application/pkcs7-mime”的代码。当然,如果有人知道如何在没有这种方法的情况下解决没有共享服务器的文件,我也对此持开放态度。据我所知,这可能是假设可以做到这一点的唯一方法。

标签: phpjsonwordpressapiurl-rewriting

解决方案


注意:我假设 WordPress 安装在根文件夹中。

因此,如果您想提供这样http://example.com/apple-app-site-association的 JSON 内容并将内容类型(标头)设置为,您可以选择以下选项:Content-Typeapplication/pkcs7-mime

动态内容

因为您使用的是 WordPress,所以这可能是比手动编辑.htaccess文件更好的选择。

您可以使用parse_request挂钩;这样,您不需要任何自定义(WordPress)重写规则,不需要自定义页面(帖子类型page),也不需要创建任何 JSON 文件。

并确保apple-app-site-association根文件夹中没有命名文件,或者 WordPress 页面没有 slug apple-app-site-association

所以这将进入您的主题函数文件(例如wp-content/themes/your-theme/functions.php):

<?php
add_action( 'parse_request', 'serve_apple_app_site_association', 0 );
function serve_apple_app_site_association( $wp ) {
    // Check if the request is /apple-app-site-association
    if ( 'apple-app-site-association' !== $wp->request ) {
        return;
    }

    // Array version of the JSON data.
    $data = array(
        'applinks'    => array(
            'apps'    => array(),
            'details' => array(
                array(
                    'appID' => '9JA89QQLNQ.com.apple.wwdc',
                    'paths' => array(
                        '/wwdc/news/',
                        '/videos/wwdc/2015/*',
                    ),
                ),
                array(
                    'appID' => 'ABCD1234.com.apple.wwdc',
                    'paths' => array(
                        '*',
                    ),
                ),
            ),
        ),
    );

    // Send headers.
    status_header( 200 );
    nocache_headers();
    header( 'Content-Type: application/pkcs7-mime' );

    // And serve the JSON data.
    echo wp_json_encode( $data );
    exit;
}

静态内容

  1. 将 JSON 数据放在一个名为apple-app-site-association(即无扩展名)的文件中,并将文件保存在您可以看到wp-config.php.htaccess文件的根文件夹中。

  2. 将此添加到您的.htaccess文件中:

<Files apple-app-site-association>
        Header set Content-Type application/pkcs7-mime
</Files>

如果<Files>和/或Header不/不适合你,那么你可以只使用上面的第一个选项,但使用类似readfile()读取静态文件的东西。

或者(特别是如果 URL 重写在您的站点上不可用/不支持),您可以创建一个以apple-app-site-association根文件夹命名的文件夹并添加index.php到该文件夹​​和该文件中:

<?php
header( 'Content-Type: application/pkcs7-mime' );
// Read the static file or just generate a dynamic content.
@readfile( __DIR__ . '/apple-app-site-association.json' );
exit;

推荐阅读