基本上,我是一个网络服务器,我在我的nginx conf中说过,将每个.cpp显示为纯文本 - 但是我想制作语法高亮以获得更多可读性。
知道我该怎么办?
我想使用谷歌亮点,所以任何想法如何在每个.cpp之前和之后插入html文件就足够了。
我想过并尝试在nginx conf中使用页眉和页脚标签,但没有任何运气。 提前谢谢!
喝彩!
答案 0 :(得分:1)
正如已经指出的那样,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文件,会发生以下情况:
cpp
结尾。@js
,因为您的请求中没有GET参数raw
。ssi on
而由SSI引擎立即处理。include virtual="$uri?raw=yes"
告诉SSI引擎从Nginx内部向原始请求的文件发出另一个请求(子请求)(内部变量$uri存储原始URI,即您的cpp的Web路径文件)。您的浏览器请求与Nginx发出的子请求之间的差异为?raw=yes
。raw
GET参数,它永远不会转到第二个位置。在这种情况下,cpp文件的原始内容将作为对子请求的响应返回。