7

Sử dụng trang kích hoạt pushState, thông thường bạn chuyển hướng chương trình SEO bằng cách sử dụng quy ước escaped_fragment. Bạn có thể đọc thêm về điều đó here..htaccess cho chương trình SEO thu thập thông tin các ứng dụng đơn lẻ mà không cần băm nhỏ

Quy ước giả định rằng bạn sẽ sử dụng tiền tố băm (#!) trước tất cả các URI của bạn trên một ứng dụng trang đơn. Chương trình SEO sẽ thoát khỏi những mảnh vỡ này bằng cách thay thế hashbang bằng quy ước riêng của nó là escaped_fragment khi thực hiện yêu cầu trang.

//Your page 
http://example.com/#!home 

//Requested by bots as 
http://example.com/?_escaped_fragment=home 

Điều này cho phép quản trị viên trang web phát hiện bot và chuyển hướng chúng đến trang được tạo sẵn được lưu trong bộ nhớ cache.

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^(.*)$ https://s3.amazonaws.com/mybucket/$1 [P,QSA,L] 

Vấn đề là hashbang bị loại bỏ nhanh chóng với sự hỗ trợ rộng rãi được điều chỉnh pushState. Nó cũng thực sự xấu xí và không trực quan với người dùng.

Vậy điều gì sẽ xảy ra nếu chúng tôi sử dụng chế độ HTML5 trong đó pushState hướng dẫn toàn bộ ứng dụng người dùng?

//Your index is using pushState 
http://example.com/ 

//Your category is using pushState (not a folder) 
http://example.com/category 

//Your category/subcategory is using pushState 
http://example.com/category/subcategory 

Có thể viết lại quy tắc hướng dẫn cho phiên bản được lưu trong bộ nhớ cache của bạn bằng quy ước mới hơn này không? Related but only accounts for index edge case. Google cũng has an article đề xuất sử dụng phương pháp chọn chọn tham gia cho vỏ cạnh đơn này bằng cách sử dụng <meta name="fragment" content="!"> trong trang <head> của trang. Một lần nữa, điều này là cho một trường hợp cạnh duy nhất. Ở đây chúng tôi đang nói về việc xử lý mọi trang dưới dạng một tùy chọn chọn tham gia senario.

http://example.com/?escaped_fragment= 
http://example.com/category?escaped_fragment= 
http://example.com/category/subcategory?escaped_fragment= 

Tôi nghĩ rằng escaped_fragment vẫn có thể được sử dụng như một định danh cho chương trình SEO, và rằng tôi có thể trích xuất tất cả mọi thứ Đáp các lĩnh vực và định danh này gắn liền với các vị trí xô tôi như:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=$ 
# (high level example I have no idea how to do this) 
# extract "category/subcategory" == $2 
# from http://example.com/category/subcategory?escaped_fragment= 
RewriteRule ^(.*)$ https://s3.amazonaws.com/mybucket/$2 [P,QSA,L] 

Cách tốt nhất để xử lý việc này là gì?

+0

Hi @ dan-kanze..Tôi đang gặp vấn đề tương tự..Bạn có bất kỳ loại giải pháp hoặc bất kỳ thứ gì có thể giúp tôi..Một cái kẹt với – Catmandu

+0

Tôi đã ở đó, pushState dường như yêu cầu bạn có các thư mục này trên đĩa của bạn. Bằng cách đó, những người hỗ trợ pushState sẽ có thể xem trang đó, cũng như các bot. – pedroassis

Trả lời

1

Đã xảy ra sự cố tương tự trên một ứng dụng web một trang.

Giải pháp duy nhất tôi tìm thấy cho vấn đề này là tạo các phiên bản trang tĩnh một cách hiệu quả nhằm mục đích tạo điều gì đó có thể điều hướng bằng chương trình Google (và các chương trình khác).

Bạn có thể tự làm điều này, nhưng cũng có các dịch vụ thực hiện chính xác điều này và tạo bộ nhớ cache tĩnh cho bạn (và phục vụ ảnh chụp nhanh cho các bot trên CDN).

Tôi đã kết thúc bằng cách sử dụng SEO4Ajax, mặc dù các dịch vụ tương tự khác có sẵn!

0

Tôi gặp sự cố tương tự. Hiện tại, tôi đã sửa đổi .htaccess như vậy:

RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^$ /snapshots/index.html? [L,NC] 
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=(.*)$ 
RewriteRule ^(.*)$ /snapshots/$1.html? [L,NC] 

Không chắc chắn nếu có giải pháp tốt hơn, nhưng nó vẫn hoạt động cho tôi. Chỉ cần đảm bảo có cấu trúc thư mục cho ảnh chụp nhanh của bạn khớp với cấu trúc URL.

0

Tôi đang sử dụng Symfony2 và mặc dù tôi được các nhà phát triển khác nói rằng Googlebot và Bingbot thực thi Javascript đủ tốt để tạo đoạn mã HTML của riêng họ, tôi không cảm thấy tự tin. Tôi cũng cảm thấy rằng việc phục vụ tài nguyên tĩnh là một lựa chọn tốt hơn cho ppl đang chạy với JS bị tắt (tuy nhiên điều này có thể xảy ra) và vì vậy, bạn cũng quan tâm đến việc phân phát các đoạn mã HTML, miễn là nó không phải là một rắc rối. Dưới đây là một phương pháp tôi đang nghĩ đến việc sử dụng nhưng chưa thử:

Dưới đây là các câu hỏi SO khác tương tự (một là của tôi).
Angularjs vs SEO vs pushState
HTML snippets for AngularJS app that uses pushState?

Dưới đây là một giải pháp tôi đăng trong câu hỏi đó và đang xem xét cho bản thân mình trong trường hợp tôi muốn gửi đoạn mã HTML để bot. Đây sẽ là một giải pháp cho một Symfony2 backend:

  1. Sử dụng PreRender hoặc một dịch vụ để tạo ra các đoạn tĩnh của tất cả các trang của bạn. Lưu trữ chúng ở đâu đó có thể truy cập được bằng bộ định tuyến của bạn.
  2. Trong tệp định tuyến Symfony2 của bạn, hãy tạo một tuyến đường phù hợp với SPA của bạn. Tôi có một SPA thử nghiệm chạy ở localhost.com/ng-test/, vì vậy con đường của tôi sẽ trông như thế này:

    # Adding a trailing/to this route breaks it. Not sure why.
    # This is also not formatting correctly in StackOverflow. This is yaml.
    NgTestReroute:
    ----path: /ng-test/{one}/{two}/{three}/{four}
    ----defaults:
    --------_controller: DriverSideSiteBundle:NgTest:ngTestReroute
    --------'one': null
    --------'two': null
    --------'three': null
    --------'four': null
    ----methods: [GET]

  3. Trong điều khiển Symfony2, hãy kiểm tra user-agent để xem nếu nó là googlebot hoặc bingbot. Bạn sẽ có thể làm điều này với các mã dưới đây, và sau đó sử dụng danh sách này để nhắm mục tiêu các chương trình bạn đang quan tâm (http://www.searchenginedictionary.com/spider-names.shtml) ...

    if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "googlebot"))
    {
    // what to do
    }

  4. Nếu bộ điều khiển của bạn tìm thấy kết quả phù hợp với bot, hãy gửi đoạn mã HTML đó. Nếu không, như trong trường hợp với ứng dụng AngularJS của tôi, chỉ cần gửi người dùng đến trang chỉ mục và Angular sẽ thực hiện chính xác phần còn lại.

Ngoài ra, nếu câu hỏi của bạn được trả lời, vui lòng chọn một câu hỏi để tôi và những người khác có thể biết điều gì phù hợp với bạn.

0

Tôi đang sử dụng PhantomJS để tạo các ảnh chụp nhanh tĩnh của các trang của tôi. Cấu trúc thư mục của tôi chỉ có một mức sâu (root/projects), vì vậy tôi có hai tệp .htaccess, trong đó tôi chuyển hướng đến tệp PHP (index-bots.php) bắt đầu quá trình PhantomJS chỉ vào SPA index.html của mình và in ra các trang tĩnh được hiển thị .

Các tập tin .htaccess trông như thế này:

/.htaccess

# redirect search engine bots to index-bots.php 
# in order to serve rendered HTML via phantomjs 
RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^/index-bots\.php [NC] 
RewriteRule ^(.*)$ index-bots.php?url=%{REQUEST_URI} [L,QSA] 

/projects/.htaccess

# redirect search engine bots to index-bots.php 
# in order to serve rendered HTML via phantomjs 
RewriteCond %{HTTP_USER_AGENT} (bot|crawl|slurp|spider) [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ ../index-bots.php?url=%{REQUEST_URI} [L,QSA] 

Một vài lưu ý:

  • !-fRewriteCond là rất quan trọng! Vì .htaccess sẽ áp dụng RewriteRule s cho tất cả các yêu cầu, nội dung trên trang của bạn sẽ được viết lại thành tệp PHP, kéo dài nhiều phiên bản của PhantomJS và đưa máy chủ của bạn đến đầu gối.
  • Điều quan trọng là miễn trừ index-bots.php khỏi ghi đè để tránh vòng lặp vô tận.
  • Tôi loại bỏ JS trong tập lệnh Á hậu PhantomJS của mình, để đảm bảo JS không làm bất cứ điều gì khi các bot hỗ trợ nó đi qua các trang 'tĩnh'.
  • Tôi không có trình hướng dẫn .htaccess, vì vậy có thể là cách tốt hơn để thực hiện việc này. Tôi rất muốn nghe nó nếu có.
Các vấn đề liên quan