Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: htaccess blokada duplikatów
Forum PHP.pl > Forum > Serwery WWW > Apache
PiotrN
Czy można osiągnąć następujący efekt:

po wpisaniu https://adresstrony.pl/blog.php --- przekierowanie --> 404,
po wpisaniu https://adresstrony.pl/blog.php?id=... --- przekierowanie --> blog.php?id=


Ponadto czy można jakoś pominąć duplikaty stron. Strona z wpisem wyświetla się pod adresem /blog.php?id=57,
ale istnieje możliwość wyświetlenia tej strony również pod adresem /blog.php?id=testowywpis

Czy można ustawić przekierowanie i zablokować indeksowanie tej z id=57 na rzecz tej drugiej?

Jak ostatecznie osiągnąć adres https://adresstrony.pl/blog/testowywpis ?
trueblue
Kod
RewriteCond %{REQUEST_URI} ^/blog.php$
RewriteCond %{QUERY_STRING} ^$
RewriteRule .* https://adresstrony.pl/blad.php [R=404,L]


Jeśli nie zadziała, to zmień drugi warunek na:
Kod
RewriteCond %{QUERY_STRING} !.



Poczytaj o kanonicznych adresach URL.
https://kawalekkodu.pl/czy-to-ty-czy-to-ja-...plicate-content


PiotrN
/blog.php?id=0

Można zrobić jeden wyjątek, aby ten powyższy adres był blokowany? Chodzi o ten konkretny adres z id=0.

Po wpisaniu /blog.php -- przekierowanie --> 404
Po wpisaniu /blog.php?id=0 -- przekierowanie --> 404
trueblue
Za drugim warunkiem dodaj flagę: [OR]
i trzeci warunek:
Kod
RewriteCond %{QUERY_STRING} ^id=0$


Spróbuj takich reguł:
Kod
RewriteCond %{REQUEST_URI} ^/blog.php$
RewriteCond %{QUERY_STRING} !^id=(\d+)$ [OR]
RewriteCond %{QUERY_STRING} ^id=0$
RewriteRule .* https://adresstrony.pl/blad.php [R=404,L]

Powinny przekierować wszystkie nienumeryczne (w tym brak) i zerowe id na 404.
PiotrN
Wielkie dzięki! Twoja pomoc jest nieoceniona.

Zastanawiam się jeszcze nad dwoma przypadkami.
Oprócz tego co napisałeś dodałem jeszcze do .htaccess poniższą linijkę:
Kod
RewriteRule ^blog/([^/]*)$ /blog.php?id=$1 [L]

O ile /blog.php?id=0 został skutecznie zablokowany, tak /blog/0 nadal nie.

Poza tym zastanawiam się, czy można na sztywno ustawić takie przedziały ID, które przekierują na 404 - np. 0-49 (?id=0, ?id=20, /id=49) i 61-100.

Znasz może jakieś konkretne żródło, gdzie mógłbym poczytać o tym co dzieję się w tym fragmencie, który opublikowałeś?
trueblue
https://httpd.apache.org/docs/current/rewrite/
oraz jakiś podręcznik do nauki wyrażeń regularnych.

Wyrażenia regularne nie nadają się za bardzo do kryteriów opartych o zakresy liczbowe. Nie możesz tego kontrolować na poziomie kodu?

Skąd się bierze adres /blog/0, chcesz powiedzieć, że każdy wpis jest dostępny zarówno w postaci blog.php?id=X jak i blog/X?
PiotrN
Niestety tak jest - do tej samej strony prowadzą 3 różne adresy:
/blog.php?id=10
/blog/10
/blog/tytul

Nie widzę innego rozwiązania.

Niemniej, na każdej podstronie z postem jest:
  1. <link rel="canonical" href="https://adresstrony.pl/blog/tytul">

Mogę jakoś zablokować /blog/0? blog.php?id=0 jest już zablokowane i odsyła na 404.
trueblue
Kod
RewriteCond %{REQUEST_URI} !^/blog/(\d+)$ [OR]
RewriteCond %{REQUEST_URI} ^/blog/0$
RewriteRule .* https://adresstrony.pl/blad.php [R=404,L]
PiotrN
Niestety, ale coś nie trybi...

Pewnie problemem jest to:
Kod
RewriteRule ^blog/([^/]*)$ /blog.php?id=$1 [L]

Cały .htaccess:
Kod
Options -Indexes

Index przerwa.html index.php

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteRule ^blog/([^/]*)$ /blog.php?id=$1 [L]

RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{REQUEST_URI} ^/blog.php$
RewriteCond %{QUERY_STRING} !^id=(\d+)$ [OR]
RewriteCond %{QUERY_STRING} ^id=0$
RewriteRule .* https://adresstrony.pl/404.shtml [R=404,L]

RewriteCond %{REQUEST_URI} !^/blog/(\d+)$ [OR]
RewriteCond %{REQUEST_URI} ^/blog/0$
RewriteRule .* https://adresstrony.pl/404.shtml [R=404,L]

Próbowałem usuwać też tymi ogólnodostępnymi metodami rozszerzenia pozostałych podstron, aby zamiast /kontakt.php było /kontakt, ale też nie chciało coś działać...

W taki sposób poradziłem sobie z /blog/0:
Kod
Redirect 301 /blog/0 /404.shtml


Chciałbym jeszcze usunąć rozszerzenia .php, aby było /kontakt zamiast /kontakt.php
trueblue
Poszperaj w Google, znajdziesz rozwiązanie ostatniego problemu.
Przy czym linki w serwisie musisz generować bez rozszerzenia .php, jeśli takie istnieją.
PiotrN
Dziwna sytuacja.

Co zrobić w przypadku, gdy nie mogę dostać się do katalogu /cms z powodu "pętli przekierowań"?

"ERR_TOO_MANY_REDIRECTS"

Pomaga dopiero gdy wyłączę https://
Kod
RewriteCond %{HTTPS} !=on


Kod
RewriteCond %{HTTPS} !=off


Ciasteczka mam włączone,
Zgodnie z sugestiami też je usuwałem,
Sprawdzałem na trzech różnych przeglądarkach.

Jaka może być przyczyna? Pozostaje tylko kontakt z hostingiem?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.