Skocz do zawartości

mod_rewrite


ruda wiewióra

Rekomendowane odpowiedzi

Witajcie :dirol:

Potrzebuję pomocy w zamianie adresów na bardziej przyjazne. Czytam i czytam o mod_rewrite, ale wszystkie te regułki są dla mnie czarną magią i nie potrafię przekształcić ich odpowiednio dla swojej strony. Może ktoś z Was znajdzie chwilkę żeby coś mi doradzić :)

Po pierwsze chciałabym dowiedzieć się, czy można hurtowo usunąć rozszerzenie ze wszystkich plików .php tak żeby podstrony miały postać np. www.domena.pl/fotografia zamiast www.domena.pl/fotografia.php

Czy jeśli takich podstron jest więcej, to da się napisać taką komendę, która usuwałaby rozszerzenie z nich wszystkich, czy trzeba pisać komendy do każdej podstrony osobno?

I po drugie: jak zmienić adres np. www.domena.pl/fotografia/slubna/plener.php?id=plener002.jpg na www.domena.pl/fotografia/slubna/plener/plener002 albo www.domena.pl/fotografia/slubna/plener/plener002.jpg czy coś w tym stylu? Chodzi o wyeliminowanie tego fragmentu .php?id=

I tu znów pytanie: czy da się to zrobić hurtowo dla wszystkich zdjęć, czy trzeba pisać osobną komendę dla każdego zdjęcia?

Może ktoś z Was mnie oświeci, bo to chyba na ten moment przewyższa moje umiejętności :) a bardzo chciałabym lada moment uruchamianą stronę wrzucić już z takimi sympatyczniejszymi adresami.

Z góry bardzo dziękuję za pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Po pierwsze, nie wiem czy wiesz to czy nie dlatego napiszę :dirol:

struktura pliku .htaccess wygląda tak:

pierwsza linijka: RewriteEngine On

potem w następnych linijkach są komendy i ostatnia linijka musi pozostać pusta ;]

1. Czy mozna usunąć hurtowo rozszerzenia ze wszystkich plików .php

Nie wiem czy da się hurtowo to zrobić ale robi to się tak:

przykładowo: RewriteRule ^fotografie$ fotografie.php

po za tym, najlepiej jest Tworzyć stronę działającą TYLKO w obrębie indexu (index.php) czyli w pliku index.php dajesz coś takiego:

...

<body>

<?php include('includes/index1.php'); ?>

</body>

...

i w pliku index1.php określasz co ma być wyświetlane, czyli zamiast tworzyć stronę kontakt.php regulamin.php fotografia.php to tworzysz:

index.php?action=kontakt

index.php?action=regulamin

index.php?action=fotografia

itd.

czyli plik index1.php powinien wyglądać tak:

<?php

if(!isSet($_GET['action'] or $_GET['action'] == 'index') { include('tresc_strony_glownej.php'); }

if($_GET['action'] == 'fotografia') { include('fotografia.php');

...

?>

i w plikach fotografia.php, tresc_strony_glownej.php masz treść odpowiednich podstron :)

i teraz jak zrobić, zęby w url było www.TwojaDomena.pl/fotografia

zamiast

www.TwojaDomena.pl/index.php?action=fotografia

w pliku .htaccess dodajesz komendę:

RewriteRule ^([^/,]+)$ index.php?action=$1

i ładnie będzie działać i wyeliminuje się problem zmiany każdej podstrony w .htaccess :)

2.

jak zmienić www.domena.pl/fotografia/slubna/plener.php?id=plener002.jpg

otóż w pliku .htaccess dodajesz komendę:

RewriteRule ^fotografia/slubna/plener/([^/,]+)$ fotografia/slubna/plener.php?id=$1

lub

RewriteRule ^plener/([^/,]+)$ plener.php?id=$1

(to zależy jaką masz strukture plików)

najlepiej jak poczytasz sobie o wyrażeniach regularnych to te kszaki staną się wyraźniejsze ^^

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki wielkie za odpowiedź :)

Mam parę wątpliwości (a właściwie całe mnóstwo, bo to wszystko wygląda dość przerażająco :dirol: ale trochę pokombinuję i pewnie to czy tamto mi się rozjaśni :) ).

Co w sytuacji, jeżeli jakaś podstrona jest umieszczona w osobnym katalogu? Wystarczy wtedy w kodzie dopisać nazwę katalogu? np.

<?php

if(!isSet($_GET['action'] or $_GET['action'] == 'index') { include('tresc_strony_glownej.php'); }

if($_GET['action'] == 'nazwa_podstrony') { include('nazwa_katalogu/nazwa_podstrony.php');

...

?>

I czy to ma wyglądać w ten sposób, że plik index.php ma najpierw cały "wstęp", czyli doctype, title itd, i dopiero później

<body>

<?php include('includes/index1.php'); ?>

</body>

czy ten kod ma być jedyną zawartością indexu? Domyślam się, że ma być bez tego "wstępu", ale wolę się upewnić, bo jeśli ma być też title itd, to jak wtedy wyglądałaby kwestia odrębnych tytułów itp. do każdej podstrony?:)

Na razie to tyle, całą resztę chyba w miarę ogarniam :)

I dzięki wielkie za podpowiedź odnośnie struktury pliku .htaccess bo nie wiedziałam, że powinien tak wyglądać i ładowałam wszystkie komendy w nieodpowiednich miejscach, dziwiąc się że nie działają :)

Aaa, i jeszcze jedno!

Czy kiedy uda mi się to wszystko zbudować w taki sposób jak opisałeś i podstrony będą działać pod adresami typu www.domena.pl/fotografia to w menu powinnam jakoś odpowiednio pisać ścieżkę do podstron?

Dajmy na to, że mam w menu link do działu fotografia. W jaki sposób ma wyglądać a href?

<a href="https://www.domena.pl/fotografia">fotografia</a>

<a href="index.php?action=fotografia">fotografia</a>

czy jeszcze jakoś inaczej?

Odnośnik do komentarza
Udostępnij na innych stronach

Co w sytuacji, jeżeli jakaś podstrona jest umieszczona w osobnym katalogu? Wystarczy wtedy w kodzie dopisać nazwę katalogu? np.

<?php

if(!isSet($_GET['action'] or $_GET['action'] == 'index') { include('tresc_strony_glownej.php'); }

if($_GET['action'] == 'nazwa_podstrony') { include('nazwa_katalogu/nazwa_podstrony.php');

...

?>

dokładnie tak ;]

I czy to ma wyglądać w ten sposób, że plik index.php ma najpierw cały "wstęp", czyli doctype, title itd, i dopiero później

<body>

<?php include('includes/index1.php'); ?>

</body>

czy ten kod ma być jedyną zawartością indexu? Domyślam się, że ma być bez tego "wstępu", ale wolę się upewnić, bo jeśli ma być też title itd, to jak wtedy wyglądałaby kwestia odrębnych tytułów itp. do każdej podstrony?

najprościej będzie jak podam przykład:

index.php (główny plik)

<!DOCTYPE html 
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
<!-- tu zamieszczamy niezmienne metatagi na każdej stronie  i linki do plików css -->
<meta name="Language" content="PL" />
<meta name="Copyright" content="Reserved." />
<meta name="Robots" content="index, follow, all" />
<meta name="Distribution" content="Global" />
<meta name="revisit-after" content="3 days" />

<!-- tu jest kod php z plikiem obsługującym dynamiczne tytuły stron i metatagi -->
<?php include('skrypty/header.php'); ?>

</head>
<body>
<?php

// najpier deklarujemy zmienne które będą widoczne w pliku layoutu strony (nie zmienialne czyli header - top strony, menu itp;)
$header = 'includes/header.php');
$menu = 'includes/menu/menu.php');
$stopka = 'includes/stopka.php');

// teraz includujemy plik odpowiedzialny za generowanie treści strony i layoutu

include('includes/index1.php');
include('layout/lay.php');


?>



</body>
</html>

ta struktura jest przykładowa i pisana z palca więc można wymyślić coś bardziej optymalnego i wygodnego dla programisty i grafika :) ale to ma być przykład ;p

teraz w pliku index1.php mamy:

<?php
if(!isSet($_GET['action'] or $_GET['action'] == 'index') {$tresc = 'tresc_strony_glownej.php'; }
if($_GET['action'] == 'fotografia') { $tresc = 'fotografia.php';
...
?>

dalej w pliku lay.php mamy:

<div id="header"><?php include($header); ?></div>
<div id="menu"><?php include($menu); ?></div>
<div id="tresc"><?php include($tresc); ?></div>
<div id="stopka"><?php include($stopka); ?></div>

podsumowując:

Tworzysz stałe elementy strony w głównym indexie a zmienne elementy generujesz kodem php :) i oczywiście layout strony oddzielasz jak najbardziej od kodu php :]

czyli w dynamiczne tytuły i metatagi możesz generować w identyczny sposób jak treść strony z tą różnicą, że includujesz odpowiednie pliki z metatagami, jak np jest to forum, to includujesz plik php który pobiera tytuły i opisy postów / tematów i ładujesz w znaczniki <title> <meta> ;] zasada jest prosta i trzeba tylko pomyśleć jak mądrze to rozplanować, żeby się nie pogubić. Dodatkowo ta metoda wymaga dokładnej znajomości struktury linków na swojej stronie żeby nie było sytuacji że zmienne przekazywane będą się różnić w plikach bo przy konwersji urli na przyjazne zmienne mają ściśle określoną kolejność w url'u ;] na to trzeba uważać

Aaa, i jeszcze jedno!

Czy kiedy uda mi się to wszystko zbudować w taki sposób jak opisałeś i podstrony będą działać pod adresami typu www.domena.pl/fotografia to w menu powinnam jakoś odpowiednio pisać ścieżkę do podstron?

Dajmy na to, że mam w menu link do działu fotografia. W jaki sposób ma wyglądać a href?

<a href="https://www.domena.pl/fotografia">fotografia</a>

<a href="index.php?action=fotografia">fotografia</a>

czy jeszcze jakoś inaczej?

linki mają wyglądać tak, jak Ty tego chciałeś ;] czyli wpisujesz przyjazne linki:

<a href="https://www.domena.pl/fotografia">fotografia</a>

Odnośnik do komentarza
Udostępnij na innych stronach

Strasznie to wszystko skomplikowane, ale spróbuję :)

Na razie próbowałam na szybko stworzyć plik index.php który zawierał tylko ten fragment

<body>

<?php include('includes/index1.php'); ?>

</body>

i wtedy po wejściu na index.php pokazywał mi się komunikat

Parse error: syntax error, unexpected T_LOGICAL_OR, expecting ',' or ')' in /homez.228/pastelow/www/includes/index1.php on line 2

ale może to właśnie kwestia tego, że w kodzie nie było nic poza <body>?

Przy okazji mam jeszcze jedno pytanie, czy jest jakiś program oprócz Krasnala, dzięki któremu mogłabym widzieć na dysku to, co jest robione w php? Krasnala próbowałam ściągać, ale wszędzie pokazywał mi się wirus, a dosyć ciężko mi się pracuje kiedy nie mogę na bieżąco podglądać czy wszystko działa tak jak powinno :)

Odnośnik do komentarza
Udostępnij na innych stronach

Parse error: syntax error, unexpected T_LOGICAL_OR, expecting ',' or ')' in /homez.228/pastelow/www/includes/index1.php on line 2

syntax error - błąd składni ;] zapamiętaj ten błąd bo on jest częstym błędem w każdym języku programowania, tak samo jak constract error - przekroczenie zakresu. w Twoim przypadku w kodzie zapomniałeś o przecinku lub nie zamknąłeś nawiasu :)

a co do programu to wamp server :) nie wiem na jakiej on jest licencji ale chyba jest darmowy

Odnośnik do komentarza
Udostępnij na innych stronach

Ściągnęłam wampserver ale zupełnie nie wiem jak tam odpalić stronę :) Próbowałam też z EasyPHP ale mam ten sam problem. Nie wiem czy tam trzeba coś skonfigurować i jak, próbowałam wrzucić katalog ze stroną do katalogu "www" ale nic się nie uruchamiało jak powinno. Pewnie to znowu coś przewyższającego moje umiejętności :P

Odnośnik do komentarza
Udostępnij na innych stronach

EDIT: Chyba jednak spróbuję to wszystko zrobić na razie tym sposobem: RewriteRule ^fotografie$ fotografie.php bo zanim ogarnę te serwery, php itd. to wieki miną, a zależy mi żeby stronę wrzucić do końca tygodnia :) Kiedyś sobie to wszystko na spokojnie pozmieniam :)

Ale mam jeszcze jedno pytanie: czy jeżeli podstronę www.domena.pl/fotografia.php zamienię na www.domena.pl/fotografia to powinnam też ustawić przekierowanie, żeby po wpisaniu www.domena.pl/fotografia.php automatycznie włączało się www.domena.pl/fotografia ?

Odnośnik do komentarza
Udostępnij na innych stronach

jeśli chodzi o wamp, to włączasz go po instalacji potem w przeglądarce wpisujesz https://localhost/ i tam wybierasz katalog ze stroną ;)

A czym może być spowodowany taki komunikat?

"Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log."

Wyskakuje mi kiedy próbuję wejść na stronę z https://localhost/ ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Internal Server Error to jest błąd nr. 500, poczytaj trochę o nim :)

ale generalnie spowodowany on jest tym, że są błędy w pliku .htaccess

Najlepiej będzie jak go tu pokażesz co tam naskrobałaś ;p

a przykładowo przeczytać możesz to: https://kb.forpsi.pl/article.php?id=033

Odnośnik do komentarza
Udostępnij na innych stronach

Aaa :) Myślałam, że to coś nie tak z wampem - rzeczywiście po usunięciu .htaccess by działało ;)

Mam tam coś takiego:

RewriteEngine on

RewriteCond %{HTTP_HOST} !^www. [NC]

RewriteRule ^(.*)$ https://www.domena.pl/$1 [L,R=301]

RewriteCond %{REQUEST_URI} ^\/index.php$

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^(.*)$ https://domena.pl/ [L,R=301]

ErrorDocument 404 https://www.domena.pl/404.php

EDIT: Działa! :) Nie miałam uruchomionej funkcji mod_rewrite, poprawiłam ją wg tych wskazówek https://flo.com.pl/blog/php/wampserver-i-mod_rewrite/ i jest ok :)

EDIT 2: Tak się zastanawiam - czy jeżeli na serwerze mam plik "fotografia.php" i folder "fotografia", i ustawię sobie, żeby podstrony wyświetlało jako www.domena.pl/fotografia to ten adres nie będzie mi wyświetlał zawartości folderu "fotografia"?

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, wymodziłam coś, ale zanim to wrzucę to chciałabym się upewnić czy nie ma w tym jakichś głupot :D

Póki co stronę mam zbudowaną jeszcze starym sposobem (jak będę mieć więcej czasu to pewnie spróbuję ją przerobić na taką zbudowaną w oparciu o <?php include ), więc muszę chyba każdą podstronę zamieniać na "bez-php" osobno (w tym kodzie poniżej dałam kilka przykładowych, ostatecznie byłoby ich dużo więcej), zrobiłam też jednak przekierowanie ze stron z .php na bez .php. Czy to może w ogóle tak wyglądać? Nie wiem, jakie są reguły jeśli chodzi o jakieś współzależności poszczególnych komend.. i czy można ich sobie wypisywać ile się człowiekowi podoba ;) Wyglądałoby to mniej więcej tak:

RewriteEngine on

RewriteCond %{HTTP_HOST} !^www. [NC]

RewriteRule ^(.*)$ https://www.domena.pl/$1 [L,R=301]

RewriteCond %{REQUEST_URI} ^\/index.php$

RewriteCond %{QUERY_STRING} ^$

RewriteRule ^(.*)$ https://domena.pl/ [L,R=301]

RewriteRule ^fotografia$ fotografia.php

RewriteRule ^projekty-graficzne$ projekty-graficzne.php

RewriteRule ^rekodzielo$ rekodzielo.php

RewriteRule ^przygotowania$ przygotowania.php

RewriteRule ^ceremonia$ ceremonia.php

RewriteRule ^wesele$ wesele.php

RewriteRule ^plener$ plener.php (itd. itd....)

RewriteCond %{http_host} ^www.domena.pl/fotografia.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/fotografia [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/projekty-graficzne.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/projekty-graficzne [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/rekodzielo.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/rekodzielo [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/przygotowania.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/przygotowania [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/ceremonia.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/ceremonia [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/ceremonia.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/ceremonia [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/wesele.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/wesele [r=301,nc]

RewriteCond %{http_host} ^www.domena.pl/plener.php [nc]

RewriteRule ^(.*)$ https://www.domena.pl/plener [r=301,nc] (itd. itd...)

ErrorDocument 404 https://www.domena.pl/404.php

Odnośnik do komentarza
Udostępnij na innych stronach

nie wiem po co za każdym razem robisz przekierowanie 301 ^^ efektem tego będzie to że po wejściu na np. domena.pl/fotografia.php przekieruje na domena.pl/fotografia ale po co? ;p jak w linkach dasz odpowiednie linki to nie ma to znaczenia a tylko przybywa kodu ;] ja bym to zostawił tylko na zamianie urli czyli tak jak jest na górze:

RewriteRule ^fotografia$ fotografia.php

a w momencie gdyby pojawiła się jakaś zmienna czyli przykładowo ../plener.php?id=3 to tak:

RewriteRule ^plener/([^/,]+)$ plener.php?id=$1

i starczy ;p chociaż fakt, jak ma być tego dużo więcej to powinnaś to zoptymalizować bo na pewno jakieś opóźnienia będą z tego tytułu :D

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności