基本上,我有一个网络服务器,我在我的 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 文件会发生什么:
- 请求转到第一个位置,因为 URI 以
cpp
结尾。 - 然后被重定向到第二个位置
@js
,因为你的请求中没有GET参数raw
。 - 在第二个位置,SSI 模板是用 return 生成的然后立即由 SSI 引擎处理,因为
ssi on
。 include virtual="$uri?raw=yes"
告诉 SSI 引擎从 Nginx 中向最初请求的文件发出另一个请求(子请求)(内部变量 $uri 存储原始 URI,即您的 cpp 文件的 Web 路径)。来自浏览器的请求和 Nginx 发出的子请求之间的区别是?raw=yes
。- 子请求再次由第一个位置处理,但它永远不会转到第二个位置,因为
raw
GET 参数。在这种情况下,cpp 文件的原始内容作为对子请求的响应返回。 - SSI 引擎将此响应与模板的其余部分结合起来,并将结果返回给浏览器。此外,default_type告诉浏览器将结果呈现为 HTML 文档。
您可以看到输出示例 here .我用了this此示例的突出显示库。您可以根据自己的喜好更改它,只需修改 SSI 模板即可。
关于c++ - 每个 cpp 的 nginx 语法高亮显示,无需人工交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41506790/