nginx上的语法高亮显示每个cpp没有人工交互

时间:2017-01-06 13:28:22

标签: c++ nginx webserver highlight

基本上,我是一个网络服务器,我在我的nginx conf中说过,将每个.cpp显示为纯文本 - 但是我想制作语法高亮以获得更多可读性。

知道我该怎么办?

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

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

喝彩!

1 个答案:

答案 0 :(得分:1)

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

第一个明显的选择是在Nginx中使用服务器端处理语言。至少有三个可选模块可用于三种不同的语言(PerlLua和方言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. 在第二个位置使用return生成SSI模板,然后由于ssi on而由SSI引擎立即处理。
  4. include virtual="$uri?raw=yes"告诉SSI引擎从Nginx内部向原始请求的文件发出另一个请求(子请求)(内部变量$uri存储原始URI,即您的cpp的Web路径文件)。您的浏览器请求与Nginx发出的子请求之间的差异为?raw=yes
  5. 子请求再次由第一个位置处理,但由于raw GET参数,它永远不会转到第二个位置。在这种情况下,cpp文件的原始内容将作为对子请求的响应返回。
  6. SSI引擎将此响应与模板的其余部分组合在一起,并将结果返回给浏览器。此外,default_type告诉浏览器将结果呈现为HTML文档。
  7. 您可以看到输出here的示例。我在这个例子中使用了this突出显示库。您只需修改SSI模板即可随意更改。