每个 cpp 的 nginx 语法高亮显示,无需人工交互

Syntax highlight on nginx for every cpp without human interaction

基本上,我有一个网络服务器,我在我的 nginx conf 中声明,将每个 .cpp 显示为纯文本 - 但我想突出显示语法以提高可读性。

知道我该如何继续吗?

我想使用 google 高亮显示,因此任何关于如何在每个 .cpp 前后插入 html 文件之前的想法就足够了。

我在过去曾想过并尝试过在 nginx conf 中使用页眉和页脚标签,但没有任何运气。 提前致谢!

干杯!

正如已经指出的那样,Nginx 不太适合自己生成 HTML 文档。通常这是服务器端处理语言(如 PHP 或 Perl)的工作。但是,有几种方法可以单独使用 Nginx 来解决问题。

第一个显而易见的选择是使用 Nginx 中的服务器端处理语言。对于三种不同的语言 (Perl, Lua and a dialect of Javascript),至少有三个可选模块可用于此目的。

这种方法的问题是默认情况下这些模块很少可用,在许多情况下,您必须手动构建 Nginx 才能启用其中的任何一个。有时这会很痛苦,因为一旦您获得了自己定制的 Nginx 构建版本,您就必须自己支持和升级它。

然而,还有另一种选择,涉及 SSI。它可能不是最漂亮的解决方案,但它会起作用。与上述模块不同,SSI 支持几乎随 Nginx 的每个发行版一起提供。我敢打赌,您的 Nginx 可以开箱即用地执行 SSI,而无需编译任何东西。

所以,配置是这样的:

# Define a special virtual location for your cpp files
location ~* \.(cpp|h)$ {
    # Unless a GET parameter 'raw' is set with 'yes'
    if ($arg_raw = 'yes') {
        break;
    }

    # Redirect all the requests for *.cpp and *.h files to another location @js
    try_files @js @js;
}

location @js {
    ssi on;                  # Enable SSI in this location
    default_type text/html;  # Tell the browser that what is returned is HTML

    # Generate a suitable HTML document with an SSI insertion
    return 200 '<!DOCTYPE html>
                <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/default.min.css">
                <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js"></script>
                <script>hljs.initHighlightingOnLoad();</script>
                <pre><code class="cpp"><!--# include virtual="$uri?raw=yes" --></code></pre>';
}

现在如果您在浏览器中请求一些 *.cpp 文件会发生什么:

  1. 请求转到第一个位置,因为 URI 以 cpp 结尾。
  2. 然后被重定向到第二个位置@js,因为你的请求中没有GET参数raw
  3. 在第二个位置,SSI 模板是用 return 生成的,然后由于 ssi on.
  4. 而立即由 SSI 引擎处理
  5. include virtual="$uri?raw=yes"告诉SSI引擎从Nginx内部向原来请求的文件发出另一个请求(子请求)(内部变量$uri存储了原始URI,即web路径你的 cpp 文件)。来自您的浏览器的请求与 Nginx 发出的子请求之间的区别是 ?raw=yes.
  6. 子请求再次由第一个位置处理,但它永远不会转到第二个位置,因为 raw GET 参数。在这种情况下,cpp 文件的原始内容作为对子请求的响应返回。
  7. SSI 引擎将此响应与模板的其余部分组合在一起,returns 将结果发送给浏览器。此外,default_type 告诉浏览器将结果呈现为 HTML 文档。

您可以查看此示例的输出 here. I used this 突出显示库的示例。您可以根据自己的喜好更改它,只需修改 SSI 模板即可。