Προστασία ευρετηρίασης (ασφάλεια εκτός παραγωγής)
Η εμφάνιση ενός staging ή τοπικού αντιγράφου του ιστοτόπου σας στο Google είναι ένα από τα πιο συνηθισμένα — και πιο επιζήμια — λάθη SEO: διπλότυπο περιεχόμενο που ανταγωνίζεται τις πραγματικές σελίδες σας, ένα ιδιωτικό περιβάλλον στο ευρετήριο και εβδομάδες καθαρισμού με το εργαλείο αφαίρεσης URL. Η κλασική αιτία είναι ένα noindex που υπάρχει μόνο σε ένα .env που ξεχάσατε να ορίσετε, ή ένας κανόνας robots που αντικαταστάθηκε κατά την ανάπτυξη.
Η προστασία ευρετηρίασης το κάνει δύσκολο από κατασκευής. Συνδέστε τη δυνατότητα ευρετηρίασης με το περιβάλλον Laravel αντί για μια σημαία που κάποιος πρέπει να θυμάται: όταν η εφαρμογή εκτελείται οπουδήποτε εκτός της λίστας επιτρεπόμενων, επιβάλλεται σε κάθε σελίδα noindex,nofollow, το διαχειριζόμενο robots.txt αποκλείει όλους τους ανιχνευτές και το seo:audit το δηλώνει ξεκάθαρα.
Πρόκειται για δωρεάν δυνατότητα του πυρήνα.
Τι κάνει όταν είναι ενεργή
Όταν το app()->environment() δεν βρίσκεται στο seo.indexing_guard.allowed_environments (και η προστασία είναι ενεργοποιημένη), συμβαίνουν αυτόματα τέσσερα πράγματα:
- Ο resolver επιβάλλει
noindex,nofollowσε κάθε σελίδα. Αυτό εφαρμόζεται πάνω από ολόκληρη την αλυσίδα προτεραιότητας — αντικαθιστά ακόμη και μια ρητή τιμήrobotsανά σελίδα, αποθηκευμένη στοseo_meta. - Μια κεφαλίδα HTTP
X-Robots-Tag: noindex,nofollowαποστέλλεται σε κάθε απόκριση που δρομολογείται μέσω της εφαρμογής — δείτε παρακάτω τις Αποκρίσεις εκτός HTML. - Το
SEO::robotsTxt()->build()παράγει έναrobots.txtμε καθολική απαγόρευση (καιai.txt) — ένα απλόUser-agent: */Disallow: /. Αυτό καλύπτει τόσο την εντολήseo:robots-txtόσο και την προαιρετική δυναμική διαδρομή. - Το
seo:auditεκτυπώνει ευδιάκριτη ειδοποίηση, ώστε η κατάσταση «όλα είναι noindex» να μη σας εκπλήσσει ποτέ όταν διαβάζετε μια αναφορά.
Στα επιτρεπόμενα περιβάλλοντα (από προεπιλογή, production) η προστασία παραμένει εντελώς αδρανής — καμία αλλαγή εξόδου, ίδια απόδοση byte προς byte.
Αποκρίσεις εκτός HTML (PDF, ροές, εικόνες)
Η επιβαλλόμενη μετα-ετικέτα robots φτάνει μόνο σε ανιχνευτές που αναλύουν HTML — ένα PDF, μια ροή RSS/Atom, μια εικόνα ή οποιαδήποτε άλλη απόκριση εκτός HTML δεν περιέχει <head>. Γι' αυτό, όταν είναι ενεργή, η προστασία αποστέλλει την ίδια οδηγία και ως κεφαλίδα HTTP, μέσω ενός καθολικού middleware:
X-Robots-Tag: noindex,nofollowΗ κεφαλίδα και η μετα-ετικέτα προέρχονται από την ίδια πηγή, επομένως δεν μπορούν ποτέ να διαφωνήσουν. Η κεφαλίδα είναι ενεργή από προεπιλογή μέσα στην προστασία (η ίδια η προστασία απαιτεί ρητή ενεργοποίηση και είναι αδρανής στα επιτρεπόμενα περιβάλλοντα)· απενεργοποιήστε την για να κρατήσετε μόνο τη μετα-ετικέτα:
'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). Ενεργοποιήστε την με μία γραμμή:
SEO_INDEXING_GUARD=trueΜε την προεπιλεγμένη λίστα επιτρεπόμενων, το production δεν επηρεάζεται, οπότε μπορείτε να κρατήσετε την προστασία ενεργοποιημένη σε κοινόχρηστες ρυθμίσεις. Ελέγξτε ότι η λίστα περιλαμβάνει κάθε περιβάλλον που θέλετε να ευρετηριάζεται. Συνιστάται έντονα, και εξετάζεται να ενεργοποιείται από προεπιλογή στο Core 4.
Απενεργοποιήστε την με την ίδια μία γραμμή:
SEO_INDEXING_GUARD=falseΕπιλογή περιβαλλόντων που επιτρέπεται να ευρετηριάζονται
Από προεπιλογή επιτρέπεται μόνο το production. Αντικαταστήστε τη λίστα με μια μεταβλητή περιβάλλοντος με τιμές χωρισμένες με κόμμα:
# Let a public preview environment index too
SEO_INDEXING_GUARD_ALLOWED="production,prod-eu"Ή στο config/seo.php:
'indexing_guard' => [
'enabled' => env('SEO_INDEXING_GUARD', false),
'allowed_environments' => ['production', 'prod-eu'],
],Οι εγγραφές αντιστοιχίζονται με το Str::is(), επομένως λειτουργούν και χαρακτήρες μπαλαντέρ — το 'prod*' αντιστοιχεί στα production και prod-eu:
'allowed_environments' => ['prod*'],Μια κενή λίστα σημαίνει ότι κανένα περιβάλλον δεν επιτρέπεται να ευρετηριάζεται — η προστασία είναι ενεργή παντού (η ασφαλής κατεύθυνση σε περίπτωση αστοχίας). Σημειώστε ότι μια κενή ή αποτελούμενη μόνο από κενά τιμή της μεταβλητής SEO_INDEXING_GUARD_ALLOWED χρησιμοποιεί ως εναλλακτική το ['production'], ώστε ένα τυπογραφικό λάθος να μην μπορεί να αφαιρέσει σιωπηρά την παραγωγή από την ευρετηρίαση· ορίστε ρητά [] στις ρυθμίσεις αν πραγματικά θέλετε «παντού».
Επαλήθευση
Το seo:audit εμφανίζει την ειδοποίηση και, με το --json, περιλαμβάνει την κατάσταση σε μηχαναγνώσιμη μορφή:
php artisan seo:audit --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 διαφέρει από την προεπιλογή του ιστοτόπου, παράγεται πάντα ως ετικέτα.