Μετάβαση στο περιεχόμενο

Προστασία ευρετηρίασης (ασφάλεια εκτός παραγωγής)

Η εμφάνιση ενός staging ή τοπικού αντιγράφου του ιστοτόπου σας στο Google είναι ένα από τα πιο συνηθισμένα — και πιο επιζήμια — λάθη SEO: διπλότυπο περιεχόμενο που ανταγωνίζεται τις πραγματικές σελίδες σας, ένα ιδιωτικό περιβάλλον στο ευρετήριο και εβδομάδες καθαρισμού με το εργαλείο αφαίρεσης URL. Η κλασική αιτία είναι ένα noindex που υπάρχει μόνο σε ένα .env που ξεχάσατε να ορίσετε, ή ένας κανόνας robots που αντικαταστάθηκε κατά την ανάπτυξη.

Η προστασία ευρετηρίασης το κάνει δύσκολο από κατασκευής. Συνδέστε τη δυνατότητα ευρετηρίασης με το περιβάλλον Laravel αντί για μια σημαία που κάποιος πρέπει να θυμάται: όταν η εφαρμογή εκτελείται οπουδήποτε εκτός της λίστας επιτρεπόμενων, επιβάλλεται σε κάθε σελίδα noindex,nofollow, το διαχειριζόμενο robots.txt αποκλείει όλους τους ανιχνευτές και το seo:audit το δηλώνει ξεκάθαρα.

Πρόκειται για δωρεάν δυνατότητα του πυρήνα.

Τι κάνει όταν είναι ενεργή

Όταν το app()->environment() δεν βρίσκεται στο seo.indexing_guard.allowed_environments (και η προστασία είναι ενεργοποιημένη), συμβαίνουν αυτόματα τέσσερα πράγματα:

  1. Ο resolver επιβάλλει noindex,nofollow σε κάθε σελίδα. Αυτό εφαρμόζεται πάνω από ολόκληρη την αλυσίδα προτεραιότητας — αντικαθιστά ακόμη και μια ρητή τιμή robots ανά σελίδα, αποθηκευμένη στο seo_meta.
  2. Μια κεφαλίδα HTTP X-Robots-Tag: noindex,nofollow αποστέλλεται σε κάθε απόκριση που δρομολογείται μέσω της εφαρμογής — δείτε παρακάτω τις Αποκρίσεις εκτός HTML.
  3. Το SEO::robotsTxt()->build() παράγει ένα robots.txt με καθολική απαγόρευση (και ai.txt) — ένα απλό User-agent: * / Disallow: /. Αυτό καλύπτει τόσο την εντολή seo:robots-txt όσο και την προαιρετική δυναμική διαδρομή.
  4. Το seo:audit εκτυπώνει ευδιάκριτη ειδοποίηση, ώστε η κατάσταση «όλα είναι noindex» να μη σας εκπλήσσει ποτέ όταν διαβάζετε μια αναφορά.

Στα επιτρεπόμενα περιβάλλοντα (από προεπιλογή, production) η προστασία παραμένει εντελώς αδρανής — καμία αλλαγή εξόδου, ίδια απόδοση byte προς byte.

Αποκρίσεις εκτός HTML (PDF, ροές, εικόνες)

Η επιβαλλόμενη μετα-ετικέτα robots φτάνει μόνο σε ανιχνευτές που αναλύουν HTML — ένα PDF, μια ροή RSS/Atom, μια εικόνα ή οποιαδήποτε άλλη απόκριση εκτός HTML δεν περιέχει <head>. Γι' αυτό, όταν είναι ενεργή, η προστασία αποστέλλει την ίδια οδηγία και ως κεφαλίδα HTTP, μέσω ενός καθολικού middleware:

http
X-Robots-Tag: noindex,nofollow

Η κεφαλίδα και η μετα-ετικέτα προέρχονται από την ίδια πηγή, επομένως δεν μπορούν ποτέ να διαφωνήσουν. Η κεφαλίδα είναι ενεργή από προεπιλογή μέσα στην προστασία (η ίδια η προστασία απαιτεί ρητή ενεργοποίηση και είναι αδρανής στα επιτρεπόμενα περιβάλλοντα)· απενεργοποιήστε την για να κρατήσετε μόνο τη μετα-ετικέτα:

php
'indexing_guard' => [
    'send_header' => env('SEO_INDEXING_GUARD_HEADER', true),
],

Το middleware καταχωρίζεται μόνο όταν η προστασία είναι ενεργοποιημένη, επομένως ένα πακέτο με απενεργοποιημένη προστασία δεν προσθέτει τίποτα στη στοίβα σας.

Τα στατικά αρχεία παρακάμπτουν την PHP

Ένα αρχείο που επιστρέφει απευθείας ο web server σας από το public/ δεν περνά ποτέ από το Laravel, οπότε δεν μπορεί να λάβει αυτή την κεφαλίδα. Προστατεύστε το στην περιφέρεια του δικτύου (ρυθμίσεις web server / CDN). Η προστασία καλύπτει ό,τι δρομολογείται μέσω της εφαρμογής.

Γιατί υπερισχύει μιας ρητής τιμής robots

Παντού αλλού στο Rankbeam, μια ρητή αποθηκευμένη τιμή υπερισχύει — αυτός είναι ο σκοπός της αλυσίδας προτεραιότητας. Η προστασία είναι η μοναδική σκόπιμη εξαίρεση και βρίσκεται πάνω από το ρητό επίπεδο, επειδή ο κίνδυνος εδώ έχει μία κατεύθυνση:

  • Μια βάση staging είναι συνήθως αντίγραφο της παραγωγής, οπότε μια σελίδα που αποθήκευσε index,follow θα μετέφερε αυτή την οδηγία στο staging και θα ζητούσε να ευρετηριαστεί.
  • Η εσφαλμένη ευρετηρίαση του staging είναι καταστροφική· η εσφαλμένη εφαρμογή noindex σε αυτό δεν αλλάζει κάτι. Η προστασία θέτει επομένως ένα όριο που η αποθηκευμένη τιμή δεν μπορεί να παρακάμψει, ακριβώς στα περιβάλλοντα όπου ούτως ή άλλως δεν θέλετε ευρετηρίαση.

Ενεργοποίηση

Η προστασία παρέχεται απενεργοποιημένη, ώστε η εγκατάσταση ή αναβάθμιση του πακέτου να μην αλλάζει ποτέ την απόδοση ενός περιβάλλοντος εκτός παραγωγής χωρίς τη συγκατάθεσή σας (η ίδια πολιτική «ίδιο byte προς byte μέχρι τη ρητή ενεργοποίηση» που ισχύει για το blank_is_unset του resolver και τις παραγόμενες εικόνες OG). Ενεργοποιήστε την με μία γραμμή:

dotenv
SEO_INDEXING_GUARD=true

Με την προεπιλεγμένη λίστα επιτρεπόμενων, το production δεν επηρεάζεται, οπότε μπορείτε να κρατήσετε την προστασία ενεργοποιημένη σε κοινόχρηστες ρυθμίσεις. Ελέγξτε ότι η λίστα περιλαμβάνει κάθε περιβάλλον που θέλετε να ευρετηριάζεται. Συνιστάται έντονα, και εξετάζεται να ενεργοποιείται από προεπιλογή στο Core 4.

Απενεργοποιήστε την με την ίδια μία γραμμή:

dotenv
SEO_INDEXING_GUARD=false

Επιλογή περιβαλλόντων που επιτρέπεται να ευρετηριάζονται

Από προεπιλογή επιτρέπεται μόνο το production. Αντικαταστήστε τη λίστα με μια μεταβλητή περιβάλλοντος με τιμές χωρισμένες με κόμμα:

dotenv
# Let a public preview environment index too
SEO_INDEXING_GUARD_ALLOWED="production,prod-eu"

Ή στο config/seo.php:

php
'indexing_guard' => [
    'enabled' => env('SEO_INDEXING_GUARD', false),
    'allowed_environments' => ['production', 'prod-eu'],
],

Οι εγγραφές αντιστοιχίζονται με το Str::is(), επομένως λειτουργούν και χαρακτήρες μπαλαντέρ — το 'prod*' αντιστοιχεί στα production και prod-eu:

php
'allowed_environments' => ['prod*'],

Μια κενή λίστα σημαίνει ότι κανένα περιβάλλον δεν επιτρέπεται να ευρετηριάζεται — η προστασία είναι ενεργή παντού (η ασφαλής κατεύθυνση σε περίπτωση αστοχίας). Σημειώστε ότι μια κενή ή αποτελούμενη μόνο από κενά τιμή της μεταβλητής SEO_INDEXING_GUARD_ALLOWED χρησιμοποιεί ως εναλλακτική το ['production'], ώστε ένα τυπογραφικό λάθος να μην μπορεί να αφαιρέσει σιωπηρά την παραγωγή από την ευρετηρίαση· ορίστε ρητά [] στις ρυθμίσεις αν πραγματικά θέλετε «παντού».

Επαλήθευση

Το seo:audit εμφανίζει την ειδοποίηση και, με το --json, περιλαμβάνει την κατάσταση σε μηχαναγνώσιμη μορφή:

bash
php artisan seo:audit --json
json
{
    "indexing_guard": {
        "active": true,
        "environment": "staging",
        "allowed_environments": ["production"],
        "directive": "noindex,nofollow"
    },
    "pages": [ /* ... */ ]
}

Και το εξυπηρετούμενο/παραγόμενο robots.txt σε προστατευμένο περιβάλλον:

# robots.txt — managed by Rankbeam
# Indexing guard ACTIVE: this app is running in the "staging" environment,
# which is not in seo.indexing_guard.allowed_environments. Every crawler is
# disallowed so this non-production site stays out of search results.
# https://rankbeam.dev/guide/indexing-guard

User-agent: *
Disallow: /

Πεδίο εφαρμογής

Η προστασία ελέγχει τις οδηγίες ευρετηρίασης — τη μετα-ετικέτα robots, την κεφαλίδα X-Robots-Tag και το robots.txt. Δεν αγγίζει τίτλους, περιγραφές, κανονικές URL ή schema και είναι ανεξάρτητη από την πολιτική απόδοσης robots (seo.robots.emit_default): επειδή το noindex,nofollow διαφέρει από την προεπιλογή του ιστοτόπου, παράγεται πάντα ως ετικέτα.

Το rankbeam/laravel-seo διανέμεται με άδεια MIT.