在没有人工交互的情况下,在nginx上为每个cpp突出显示语法



基本上,我有一个Web服务器,我在nginx conf中说过,它将每个.cpp都显示为纯文本,但我想突出显示语法以提高可读性。

知道我该怎么做吗?

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

我在很久以前就想过并尝试过在nginx conf中使用页眉和页脚标记,但没有成功。提前感谢!

欢呼!

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

第一个显而易见的选择是使用Nginx中的服务器端处理语言。对于三种不同的语言(Perl、Lua和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模板生成并返回,然后由于ssi on而立即由SSI引擎处理
  4. include virtual="$uri?raw=yes"告诉SSI引擎从Nginx中向最初请求的文件发出另一个请求(子请求)(内部变量$uri存储原始uri,即cpp文件的web路径)。来自浏览器的请求和Nginx发出的子请求之间的差异是?raw=yes
  5. 子请求再次由第一个位置处理,但由于rawGET参数的原因,它从未转到第二个位置。在这种情况下,cpp文件的原始内容将作为对子请求的响应返回
  6. SSI引擎将此响应与模板的其余部分结合起来,并将结果返回给浏览器。此外,default_type告诉浏览器将结果呈现为HTML文档

您可以在此处看到输出的示例。我在这个例子中使用了这个高亮显示库。您可以通过修改SSI模板来更改它。

最新更新