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

标签 c++ nginx webserver highlight

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

知道我该如何继续吗?

我想使用谷歌高亮,所以任何关于如何在每个 .cpp 之前和之后插入 html 文件之前的想法就足够了。

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

干杯!

最佳答案

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

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

这种方法的问题是默认情况下这些模块很少可用,在许多情况下,您必须手动构建 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 引擎处理,因为 ssi on
  4. include virtual="$uri?raw=yes" 告诉 SSI 引擎从 Nginx 中向最初请求的文件发出另一个请求(子请求)(内部变量 $uri 存储原始 URI,即您的 cpp 文件的 Web 路径)。来自浏览器的请求和 Nginx 发出的子请求之间的区别是 ?raw=yes
  5. 子请求再次由第一个位置处理,但它永远不会转到第二个位置,因为 raw GET 参数。在这种情况下,cpp 文件的原始内容作为对子请求的响应返回。
  6. SSI 引擎将此响应与模板的其余部分结合起来,并将结果返回给浏览器。此外,default_type告诉浏览器将结果呈现为 HTML 文档。

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

关于c++ - 每个 cpp 的 nginx 语法高亮显示,无需人工交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41506790/

相关文章:

javascript - 如何将音频流从网页发送到 C++ 服务器?

html - IE11 无法通过 Web 服务器显示带有对象标签的图像,但在本地可以正常显示

C++ 删除 wchar_t* 指向的内容

c++ - 获取 : "STATUS_ACCESS_VIOLATION" when attempting to compile this C++ code

php - CakePHP 项目上的 nginx 错误 "rewrite or internal redirection cycle"

python - 使用 Nginx 的 Flask?

ruby - 403 禁止 nginx + passenger + sinatra

c++ - 以不同的字节顺序写入/读取二进制文件

c++ - 我可以从 Rust 代码调用 C 或 C++ 函数吗?

apache - 用于网络托管的端口转发