在没有人工交互的情况下,在nginx上为每个cpp突出显示语法
Syntax highlight on nginx for every cpp without human interaction
基本上,我有一个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文件,会发生以下情况:
- 请求到达第一个位置,因为URI以
cpp
结尾 - 然后它被重定向到第二个位置
@js
,因为您的请求中没有GET参数raw
- 在第二个位置,SSI模板生成并返回,然后由于
ssi on
而立即由SSI引擎处理 include virtual="$uri?raw=yes"
告诉SSI引擎从Nginx中向最初请求的文件发出另一个请求(子请求)(内部变量$uri存储原始uri,即cpp文件的web路径)。来自浏览器的请求和Nginx发出的子请求之间的差异是?raw=yes
- 子请求再次由第一个位置处理,但由于
raw
GET参数的原因,它从未转到第二个位置。在这种情况下,cpp文件的原始内容将作为对子请求的响应返回 - SSI引擎将此响应与模板的其余部分结合起来,并将结果返回给浏览器。此外,default_type告诉浏览器将结果呈现为HTML文档
您可以在此处看到输出的示例。我在这个例子中使用了这个高亮显示库。您可以通过修改SSI模板来更改它。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- Linux的Cpp上的计时器
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 命名空间中具有.h和.cpp文件的类
- 助记符和指向成员语法的指针
- 内置函数可查看CPP中的成员变量
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- main.cpp(11):错误 C2059:语法错误:"字符串"
- 主.cpp(12):错误 C2061:语法错误:标识符"vec1"
- 所有者<T*> cpp 核心指南中的 p 语法
- 如何使用 cpp 设置随机数生成器的语法?
- 在没有人工交互的情况下,在nginx上为每个cpp突出显示语法
- CS106b 库矢量.cpp错误 C2143:语法错误:'<'之前缺少';'
- cpp 中使用“”符号的语法 #define 不清楚
- 使用vim中的语法启用cpp头文件检查