2017-01-06 4 views
0

기본적으로 웹 서버는 nginx conf에서 모든 .cpp를 일반 텍스트로 표시합니다.하지만 더 읽기 쉽도록 구문 강조를 만들고 싶습니다.인간의 상호 작용없이 모든 cpp에 대한 nginx 구문 강조 표시

어떻게 진행할 수 있습니까?

Google 하이라이트를 사용하고 싶습니다. 따라서 모든 .cpp 앞뒤에 html 파일을 삽입하는 방법에 대한 아이디어 만 있으면 충분합니다.

나는 과거에는 nginx conf에서 헤더와 푸터 태그를 사용하여 행운을 전혀 생각하지 않고 시도해 보았습니다. 미리 감사드립니다.

건배!

+0

웹 서버에서 수행 할 수는 있지만 대개는 가능하지 않습니다. 대신 일반적으로 콘텐츠 전달 프레임 워크 또는 시스템에 따라 다릅니다. –

+0

서버에 콘텐츠 전송 프레임 워크가 전혀 없습니다. 파일을 보는 데 fancyindex 만 켜져 있습니다. – Hoszy

+0

Nginx 자체에서 하이라이팅 구문을 수행 할 수 없으므로 PHP와 같은 서버 측 언어를 사용하여 hilight 구문을 사용하여 html 파일을 제공하거나 js 플러그인을 사용하여 클라이언트 측에서 하이일드를 사용해야합니다. –

답변

0

이미 지적했듯이 Nginx는 HTML 문서를 자체적으로 생성하는 데 적합하지 않습니다. 보통 이것은 PHP 나 Perl과 같은 서버 측 처리 언어에 대한 작업입니다. 그러나 Nginx만으로이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

첫 번째 확실한 선택은 Nginx에서 서버 측 처리 언어를 사용하는 것입니다. 3 가지 언어 (Perl, Lua 및 방언 Javascript)에 대해 3 가지 옵션 모듈을 사용할 수 있습니다.

이 방법의 문제점은 기본적으로 이러한 모듈을 거의 사용할 수 없으며 많은 경우 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. 그런 다음 요청에 GET 매개 변수 raw이 없으므로 두 번째 위치 @js으로 리디렉션됩니다.
  3. 두 번째 위치에서 SSI 템플릿은 return으로 생성 된 다음 ssi on 때문에 SSI 엔진에서 즉시 처리됩니다.
  4. include virtual="$uri?raw=yes"은 Nginx에서 원래 요청한 파일 (내부 변수 $uri이 cpp 파일의 웹 경로 인 원래 URI를 저장함)로 다른 요청 (하위 요청)을 수행하도록 SSI 엔진에 지시합니다. 브라우저의 요청과 Nginx의 하위 요청의 차이는 ?raw=yes입니다.
  5. 보조 요청은 다시 첫 번째 위치에서 처리되지만 raw GET 매개 변수 때문에 두 번째 위치로 이동하지 않습니다. 이 경우 cpp 파일의 원시 내용이 부속 요청에 대한 응답으로 리턴됩니다.
  6. SSI 엔진은이 응답을 나머지 템플릿과 결합하여 결과를 브라우저에 반환합니다.또한 default_type은 결과를 HTML 문서로 렌더링하도록 브라우저에 지시합니다.

출력 here의 예를 볼 수 있습니다. 이 예제에서는 this 강조 라이브러리를 사용했습니다. SSI 템플릿을 수정하는 것만으로 원하는대로 변경할 수 있습니다.

+0

그게 완벽합니다. 내 요구에 정확하게 부합합니다! 탱크 이반! :) – Hoszy