Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Apache _ htaccess blokada duplikatów

Napisany przez: PiotrN 27.08.2019, 22:45:40

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 ?

Napisany przez: trueblue 28.08.2019, 06:57:29

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-czyli-duplicate-content



Napisany przez: PiotrN 28.08.2019, 12:24:02

/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

Napisany przez: trueblue 29.08.2019, 07:04:08

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.

Napisany przez: PiotrN 29.08.2019, 13:18:00

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ś?

Napisany przez: trueblue 29.08.2019, 13:26:18

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?

Napisany przez: PiotrN 29.08.2019, 14:15:12

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. <http://december.com/html/4/element/link.html 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.

Napisany przez: trueblue 29.08.2019, 14:23:51

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

Napisany przez: PiotrN 29.08.2019, 23:46:44

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

Napisany przez: trueblue 30.08.2019, 08:43:00

Poszperaj w Google, znajdziesz rozwiązanie ostatniego problemu.
Przy czym linki w serwisie musisz generować bez rozszerzenia .php, jeśli takie istnieją.

Napisany przez: PiotrN 30.08.2019, 23:50:00

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?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)