>웹 프론트엔드 >JS 튜토리얼 >NgSysV.SEO(검색 엔진 최적화)

NgSysV.SEO(검색 엔진 최적화)

Barbara Streisand
Barbara Streisand원래의
2024-12-02 15:47:10544검색

NgSysV.SEO (Search Engine Optimisation)

이 게시물 시리즈의 색인은 NgateSystems.com에 있습니다. 거기에서 매우 유용한 키워드 검색 기능도 찾을 수 있습니다.

최종 검토일: 2024년 11월

1. 소개

애플리케이션을 Google Cloud에 배포하면 키워드 '인덱스'에 추가할 콘텐츠를 검색하기 위해 웹을 순찰하는 '웹 스파이더'의 표적이 됩니다. 귀하의 사이트가 색인화되면 사람들은 검색 엔진 반환에서 해당 사이트를 볼 수 있습니다.

모두 작동하면 좋습니다. 검색 엔진은 귀하의 방향으로 비즈니스를 추진할 것이며 귀하에게 한 푼도 청구하지 않을 것입니다. 하지만 실제로는 스파이더가 사이트를 눈에 띄게 색인화하도록 장려해야 합니다. 이것이 바로 "검색 엔진 최적화"(줄여서 SEO)에 관한 것입니다 - .

사이트에 대한 좋은 SEO를 얻으려면 다음이 필요합니다.

  • 스파이더가 사이트를 탐색하는 데 도움이 되는 사이트맵 제공
  • SSR(서버측 렌더링) 및 사전 렌더링을 사용하여 "크롤링 예산" 향상
  • 봇이 페이지에서 유용한 "인덱스 가치가 있는" 콘텐츠를 찾을 수 있도록 지원

2. 웹 스파이더를 안내하는 사이트맵 및 로봇 파일 제공

귀하의 사이트는 Google(및 기타 검색 엔진)에서 색인을 생성하려는 모든 경로를 나열하는 사이트맵 파일을 제공해야 합니다. 사이트의 "트리" 계층 구조에 있는 페이지가 앵커 링크. 그러나 귀하의 사이트가 규모가 크거나 신규이고 여전히 다른 사이트에서 제대로 참조되지 않는 경우 문제가 발생할 수 있습니다.

'사이트 맵' 파일을 생성하면 이러한 문제가 해결됩니다. 사이트 맵은 여러 가지 방법으로 형식을 지정할 수 있지만 가장 간단한 방법으로 색인 엔진은 다음과 같이 페이지를 나열하는 간단한 텍스트 파일을 사용합니다.

// /static/sitemap.txt    - Don't copy this line
https://myProjectURL/inventory-display
https://myProjectURL/inventory-maintenance
etc

다음 사항에 유의하세요.

  • Google 앱 엔진에 배포된 페이지는 자동으로 https(암호화된) URL로 프로비저닝됩니다
  • "myProjectURL"은 배포 URL에 명시적으로 연결한 "사용자 정의" URL일 가능성이 높습니다.
  • 위에 표시된 "깨끗한" URL이 정적 ".pdf" 파일이거나 이와 유사한 경우에만 확장자를 추가하면 됩니다.
  • 텍스트 사이트맵은 원하는 이름으로 지정할 수 있지만 일반적으로 'sitemap.txt'라고 부릅니다. 그러나 Svelte 웹 앱에서는 이를 프로젝트의 정적 폴더에 저장하여 yaml 파일에 내장되고 웹 앱의 루트에 배포되도록 해야 합니다.

robots 파일은 사이트맵 파일에 다음과 같은 "파트너"를 제공합니다.

  • 특정 스파이더 차단: 특정 웹 크롤러가 사이트의 특정 부분에 액세스하지 못하도록 차단할 수 있습니다.
  • 특정 디렉토리 차단: 예를 들어 /admin/ 또는 /private/을 차단하여 해당 페이지를 검색 엔진 색인에 포함하지 않을 수 있습니다.
  • 사이트맵의 위치를 ​​지정합니다.

예를 들어보세요

// /static/sitemap.txt    - Don't copy this line
https://myProjectURL/inventory-display
https://myProjectURL/inventory-maintenance
etc

Svelte 프로젝트에서는 robots.txt 파일(필수 파일 이름)을 /static/robots.txt 파일에 저장해야 합니다.

robots.txt 및 sitemap.txt 파일이 브라우저를 사용하여 프로젝트의 URL 루트에 올바르게 배포되고 있는지 확인할 수 있습니다.

브라우저의 "검색" 상자에 입력된 다음 각 URL은 파일 콘텐츠를 표시하여 응답해야 합니다.

// /static/robots.txt     - Don't copy this line
User-agent: *
Disallow: https://myProjectURL/inventory-maintenance
Sitemap: https://myProjectURL/sitemap.txt

이러한 모든 문제에 대한 추가 정보는 사이트맵에 대해 알아보기에서 확인할 수 있습니다

사이트맵을 성공적으로 배포한 후에는 사이트맵을 Google Search Console에 제출하여 Google에 '미리 알림'을 제공하는 것이 유용할 수 있습니다.

여기서 "주체", 즉 사이트 URL을 등록하는 것부터 시작합니다. 여기에는 귀하가 사이트를 소유하고 있음을 Google에 확인할 수 있는 절차를 실행하는 것이 포함됩니다. 절차는 콘솔이 "사이트 확인" 파일을 "다운로드" 폴더에 다운로드하는 것으로 시작됩니다. 이 파일을 Svelte 정적 폴더에 복사하고 웹앱을 다시 빌드/재배포하여 파일을 원격 사이트에 업로드해야 합니다. 인증 화면에서 '확인' 버튼을 클릭했을 때 Google이 예상한 내용이 포함된 파일을 찾을 수 있다면 귀하가 진정한 소유자임을 만족하게 될 것입니다.

이제 화면 왼쪽 메뉴에서 "사이트맵" 도구를 클릭하면 사이트맵 URL(sitemap.txt)을 입력할 수 있고 제출된 사이트맵 창에 "성공" 상태가 표시됩니다.

Search Console은 사이트의 색인 생성 진행 상황을 모니터링하고 보고된 문제를 해결하기 위한 정교한 도구입니다. 자세한 내용은 Search Console 시작하기를 참조하세요

3. "서버 측 렌더링" 및 "사전 렌더링"을 사용하여 "크롤링 예산"을 더욱 향상시킵니다.

최근 몇 년 동안 검색 엔진은 클라이언트측 JavaScript로 렌더링된 콘텐츠를 색인화하는 능력이 향상되었지만 HTML만 포함된 페이지에 더 만족하고 있습니다. 서버측 렌더링(SSR) 콘텐츠(즉, 서버에서 데이터베이스 액세스 자바스크립트를 실행하여 HTML이 이미 생성된 페이지)는 더 자주 그리고 안정적으로 색인이 생성됩니다. Google 외에는 누구도 색인 엔진이 어떻게 작동하는지 알지 못하지만 합리적인 추측으로는 다음과 같습니다.

먼저 웹앱에 '사이트 순위'가 부여됩니다(모호한 방식으로 결정되지만 URL을 참조하는 사이트의 '백링크' 수에 영향을 받을 수 있음). 그러면 특정 "크롤링 예산", 즉 색인 엔진이 페이지 색인을 생성하는 데 사용할 준비가 된 시간이 부여됩니다. 당신은 이것을 현명하게 보내고 싶을 것입니다. 서버 측 렌더링은 봇의 작업 부하를 완화하고 예산을 더 늘릴 수 있습니다. 따라서 좋은 SEO를 원한다면 SSR을 사용해야 합니다!

서비스 측 렌더링의 궁극적인 표현은 "정적" 페이지(절대로 변경되지 않거나 거의 변경되지 않는 데이터를 표시하는 페이지)가 빌드 시 다음 명령문을 통해 렌더링되는 것입니다. 해당 page.js 또는 page.server.js 파일:

// /static/sitemap.txt    - Don't copy this line
https://myProjectURL/inventory-display
https://myProjectURL/inventory-maintenance
etc

이제 서버는 순수 HTML만 다운로드하면 되므로 크롤링 예산이 훨씬 더 늘어나고 사용자는 매우 빠른 응답을 받게 됩니다! 스케줄러를 사용하여 사전 렌더링 빌드를 자동화하는 방법에 대한 자세한 내용은 게시물 4.3을 참조하세요.

4. 봇이 페이지에서 유용한 "인덱스 가치가 있는" 콘텐츠를 찾을 수 있도록 지원

크롤링 및 색인 생성 개요에 있는 Google 문서에는 귀하가 알고 있는 모든 내용이 포함되어 있습니다. 요약은 다음과 같습니다.

우선 Google의 '모바일 우선' 정책을 숙지해야 합니다. Google 스파이더는 휴대전화에서 실행되는 브라우저에 표시되는 것처럼 귀하의 사이트를 분석합니다. 즉, 예를 들어 글꼴 크기가 너무 작다고 판단되면 사이트의 "평판"(및 크롤링 예산)이 다운그레이드됩니다.

귀하의 웹앱이 데스크톱 사용자를 위해 설계되었다면 이는 큰 타격이 될 것입니다. 휴대폰에서 귀하의 사이트를 시험해 보면 사이트가 완전히 쓸모없다고 결론을 내릴 가능성이 높습니다.

이를 해결하는 방법은 "반응형 스타일"을 사용하는 것입니다(웹 앱이 실행 중인 기기의 페이지 너비를 감지하고 그에 따라 조정하도록 Post 4.4 참조).

웹앱의 일부가 웹사이트 운영에 적합하지 않을 수 있습니다. 이를 제거하려고 할 수도 있지만 Google은 대부분의 색인 생성이 모바일 페이지에서 나온다는 점을 상기시켜 드립니다. 그러한 콘텐츠를 탭이나 "아코디언" 뒤에 부드럽게 숨길 것을 권장합니다.

웹 스파이더가 주로 찾는 것은 콘텐츠, 즉 검색 엔진 고객이 유용하다고 생각할 정보입니다. 그러나 그들은 이것을 찾고 해석하는 데 여러분의 도움이 필요합니다. 이를 수행하는 방법에 대한 몇 가지 팁은 다음과 같습니다@

  • 각 페이지에 잘 작성되고 고유한 <제목>, 및 <링크> 코드 블록. 예는 다음과 같습니다.
// /static/robots.txt     - Don't copy this line
User-agent: *
Disallow: https://myProjectURL/inventory-maintenance
Sitemap: https://myProjectURL/sitemap.txt

이 배열은 , <meta> 및 <링크> <head>의 요소 DOM에. <링크> 여기의 요소는 "https://myUrl" 및 "https://myUrl/" 등으로 다양하게 접근할 수 있는 웹사이트의 "브랜드"가 "기본" 또는 "선호" 버전인지 인덱싱 봇에게 알려줍니다. 전체 내용을 보려면 chatGPT에 "canonical"이라는 단어에 대한 튜토리얼을 요청하세요.</em> </p> <ul> <li><a> 앵커 링크는 링크된 페이지의 내용을 명확하게 설명하거나 (실용적이지 않은 경우) title= 태그로 보완됩니다. href= 태그에 절대 URL(즉, 모든 구성요소를 포함하는 URL)을 사용하세요. 여기에 예가 있습니다 </li> </ul> <pre class="brush:php;toolbar:false">// /static/sitemap.txt - Don't copy this line https://myProjectURL/inventory-display https://myProjectURL/inventory-maintenance etc </pre> <ul> <li>고정된 종류의 정보를 엄격하게 정의된 형식으로 표시하는 사이트(예: "레시피" 사이트)에서 "구조화된" 데이터 설명을 사용하세요. 이 맥락에서 '구조화된 데이터'는 페이지에 대한 정보를 제공하고 해당 콘텐츠를 분류하기 위한 표준화된 형식을 나타냅니다. 웹에서 구조화된 데이터의 가장 일반적인 형식은 Schema.org에서 게시한 형식입니다. 이에 대한 자세한 내용과 Svelte 웹앱에서 구조화된 데이터를 사용하는 방법을 알고 싶다면 chatGPT에 예시를 요청하세요. </li> </ul> <p>위 내용은 NgSysV.SEO(검색 엔진 최적화)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!</p></div><div class="nphpQianMsg"><a href="javascript:void(0);">JavaScript</a> <a href="javascript:void(0);">html</a> <a href="javascript:void(0);">Static</a> <a href="javascript:void(0);">if</a> <a href="javascript:void(0);">for</a> <a href="javascript:void(0);">while</a> <a href="javascript:void(0);">format</a> <a href="javascript:void(0);">try</a> <a href="javascript:void(0);">using</a> <a href="javascript:void(0);">private</a> <a href="javascript:void(0);">copy</a> <a href="javascript:void(0);">map</a> <a href="javascript:void(0);">JS</a> <a href="javascript:void(0);">console</a> <a href="javascript:void(0);">number</a> <a href="javascript:void(0);">dom</a> <a href="javascript:void(0);">this</a> <a href="javascript:void(0);">location</a> <a href="javascript:void(0);">href</a> <a href="javascript:void(0);">database</a> <a href="javascript:void(0);">chatgpt</a> <a href="javascript:void(0);">https</a> <a href="javascript:void(0);">everything</a> <a href="javascript:void(0);">Access</a> <a href="javascript:void(0);">SEO</a> <a href="javascript:void(0);">word</a> <a href="javascript:void(0);">Other</a><div class="clear"></div></div><div class="nphpQianSheng"><span>성명:</span><div>본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.</div></div></div><div class="nphpSytBox"><span>이전 기사:<a class="dBlack" title="if-else 논리를 사용하여 ReactJS에서 조건부 렌더링을 구현하는 방법은 무엇입니까?" href="https://m.php.cn/ko/faq/1796704551.html">if-else 논리를 사용하여 ReactJS에서 조건부 렌더링을 구현하는 방법은 무엇입니까?</a></span><span>다음 기사:<a class="dBlack" title="if-else 논리를 사용하여 ReactJS에서 조건부 렌더링을 구현하는 방법은 무엇입니까?" href="https://m.php.cn/ko/faq/1796704561.html">if-else 논리를 사용하여 ReactJS에서 조건부 렌더링을 구현하는 방법은 무엇입니까?</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>관련 기사</h2><em><a href="https://m.php.cn/ko/article.html" class="bBlack"><i>더보기</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="https://m.php.cn/ko/faq/1609.html" title="Bootstrap 목록 그룹 구성 요소에 대한 심층 분석" class="aBlack">Bootstrap 목록 그룹 구성 요소에 대한 심층 분석</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1640.html" title="JavaScript 함수 커링에 대한 자세한 설명" class="aBlack">JavaScript 함수 커링에 대한 자세한 설명</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1949.html" title="JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)" class="aBlack">JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2248.html" title="Angularjs는 WeChat UI(weui)를 통합합니다." class="aBlack">Angularjs는 WeChat UI(weui)를 통합합니다.</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2351.html" title="JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술" class="aBlack">JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!</p></div><div class="footermid"><a href="https://m.php.cn/ko/about/us.html">회사 소개</a><a href="https://m.php.cn/ko/about/disclaimer.html">부인 성명</a><a href="https://m.php.cn/ko/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>