Apache/PHP - powielanie członów w ścieżce adresu URL

0

Jakiś czas temu pisałem tutaj o moim problemie z niezmieniającym się adresem URL (w tym samym projekcie, zresztą nadal nie wiem, a nikt nie odpowiedział). Jest to zresztą ten sam projekt, co do którego niedawno prosiłem o opinie. A tym razem chodzi mi o coś w pewnym sensie przeciwnego: podczas przechodzenia na podstronę, Apache (najpewniej Apache) powiela człony w ścieżce adresu URL każdej podstrony.

Zresztą sam już nie wiem, czy to jest kwestia PHP, Apache czy mojego systemu (Fedora). A może magia? Coraz bardziej zniechęcam się do walki z linuksem.

Wygląda to tak: w pliku index-en.php, w głównym menu mam ustawione URL-e do podstron:

<a href="./php/index-en.php" [tutaj inne atrybuty]>Home</a>

Gdy klikam na ten odnośnik, przenosi mnie do strony, ale ten sam donośnik (i wszystkie pozostałe na stronie) zmieniają się na:

<a href="./php/php/index-en.php" [tutaj inne atrybuty]>Home</a>

Jak widać, człon php został powielony.

Pytajcie, to podam konfigurację (nie będę wklejał całych plików, proszę o konkretne propozycje, gdzie może siedzieć błąd).

1

przenosi mnie do strony, ale ten sam donośnik (i wszystkie pozostałe na stronie) zmieniają się

Piszesz o tym co widzisz w źródle strony, czy w pasku adresu po kliknięciu? Z tego co zrozumiałem to linki nie są w żaden sposób generowane, tylko wklepane z palca, w związku z tym nie ma opcji żeby tam się coś samo z siebie dodawało. Używasz względnych adresów, więc otwierając /php/index-en.php, w którym podane jest <a href="./php/index-en.php" [tutaj inne atrybuty]>Home</a> skrypt będzie szukał pliku index-en.php w ścieżce php/php/ bo dokładnie to mu każesz zrobić.

Zapis ./php/index-en.php mówi - do ścieżki w której obecnie jestem (po otworzeniu pliku będzie to php/) dodaj php/ i otwórz plik index-en.php. Wszystko się zgadza.

0

Piszesz o tym co widzisz w źródle strony, czy w pasku adresu po kliknięciu?

W źródle. Tfu, w pasku adresu! oraz przeglądarka wyświetla na dole strony w tej podpowiedzi.

Zapis ./php/index-en.php mówi - do ścieżki w której obecnie jestem (po otworzeniu pliku będzie to php/) dodaj php/ i otwórz plik index-en.php. Wszystko się zgadza.

To może być to! W sensie – tak należy rozumieć zapis ./. Jak to dobrze mieć spojrzenie z zewnątrz. :) Pomyślę i dam znać.

0

Zapis ./php/index-en.php mówi - do ścieżki w której obecnie jestem (po otworzeniu pliku będzie to php/) dodaj php/ i otwórz plik index-en.php. Wszystko się zgadza.

Więc wydaje mi się, że masz rację. Ale teraz nie wiem, jak to zrobić, żeby przechodziło mi zawsze do tej samej strony:

  • adresy mam wpisane w menu ręcznie, ale całe menu dołączam do każdej strony instrukcją require.
  • chciałbym mieć jednak adresy względne.

Czy da się te dwa wymagania jakoś ładnie zaimplementować? Może być nawet brzydko, byle zgodnie ze sztuką.

1

Spróbuj może z base URL. <base>: The Document Base URL element

0

Dzięki. Ale nie do końca o to mi chodziło. Na przykład, jeśli ktoś zechce sobie zrobić fork mojej strony na GitHubie, to żeby ją uruchomić, musi postawić ją na serwerze. Powiedzmy, ma lokalny serwer, czyli localhost. I teraz, żeby u mnie działało, aktualnie muszę (muszę?) gdzieś w kodzie wpisać bezwzględny adres do strony (tj. w moim systemie plików) – albo w każdym atrybucie href, albo tylko w tym atrybucie elementu <base>, albo w PHP (tylko jak?). Oczywiście ten sam adres bezwzględny u niego nie musi działać.

  1. Czy dałoby się zrobić tak, żebym nigdzie w kodzie strony nie wpisywał adresu bezwlędnego, nawet w PHP?
  2. Jeśli nie, to gdzie i jak najlepiej wpisać w PHP taki adres bezwzględny?
0

Określ stałą:

define('STALA', wartość);

gdzieś w startupie / bootstrapie, która będzie określać ściezkę URL do projektu (np. MYPROJECT_URL).

I teraz tworząc URL zawsze robisz tak, przykładowo:

<a href="<?php echo MYPROJECT_URL ?>/php/index-en.php"></a>

ewentualnie jakąś funkcję, może być statyczna która stworzy URL, coś w stylu:

\mypackage\MyURL::createURL('/php/index-en.php');

MYPROJECT_URL to może być http://domena albo http://domena/sciezka etc., w ten sposób masz dość elastyczny i prosty system dla tworzenia URL.

0

@TomRZ: no tak, brzmi to w miarę rozsądnie, tylko Twoja propozycja nadal zakłada, że jeśli mam projekt na serwerze lokalnym, to gdzieś tam w jakimś pliku muszę trzymać zmienną z /var/ścieżka albo /home/ścieżka. A ja chciałbym użyć np. jakiejś funkcji PHP, która automatycznie rozpoznawałaby katalog strony. Wiesz, jak?

0

Użyj magicznej stałej

__DIR__

Zdefiniuj sobie za jej pomocą w głównej ścieżce stałą o nazwie ROOT (czy coś w ten deseń) i wtedy odnosisz się do głównego katalogu nie znając jego nazwy, po swojej wcześniej zdefiniowanej stałej.

0

Przeanalizowałem sytuację, Wasze podpowiedzi i wyszło mi, że mam dwa warianty do wyboru:

  • Skorzystać z $_SERVER["DOCUMENT_ROOT"] lub $_SERVER["SCRIPT_FILENAME"] lub __DIR__ – problem jest taki, że każdy jeden serwer, na którym byłaby strona (lokalny czy zdalny), wymagałby innego parsowania tych bezwzględnych ścieżek (choć w specyfikacji jest coś o względnych ścieżkach dla SCRIPT_FILENAME, ale nie bardzo to rozumiem; u mnie są bezwzględne).
  • Skorzystać z <base> – problem jest taki, że jak dam tylko href="php" (bo <base> działa lokalnie, dla dokumentu, to tak mogę), to przeglądarka jakby w ogóle tego adresu nie używała, a jak dam href="localhost/php", to przeglądarka powiela człon localhost.

Napiszę jeszcze raz, o co mi chodzi:

  • chciałbym tak ustawić ścieżki w <a>, żeby nie trzeba było ich zmieniać, gdy przekopiuje się stronę na inny serwer;
  • wszystkie pliki .php mam w podfolderze php i nie chcę tego zmieniać (gdy pliki przekopiuję do głównego katalogu strony, lub nawet dam dowiązania symboliczne, to działa bez zarzutu).

Może to chodzi o jakieś ustawienie Apache? To by było całkiem w porządku.

0

Człowieku po kiego grzyba Ci ścieżka do pliku w systemie plików przy tworzeniu URLa? Jesteś w stanie to w ogóle wyjaśnić? To nie ma nic wspólnego z tworzeniem URL. Komplikujesz jedną z najprostszych rzeczy do granic śmieszności i absurdu.

Już Ci napisałem jak to zrobić: przez definicje jednej jedynej zmiennej, a poźniej używaniem jej w każdym URLu, prościej się nie da. To znaczy da się - używając ścieżek absolutnych, ale to też Ci nie pasuje. Z takim podejściem będziesz miał duże trudności, skoro męczysz się z takim banałem.

0

@TomRZ:

Już Ci napisałem jak to zrobić: przez definicje jednej jedynej zmiennej, a poźniej używaniem jej w każdym URLu, prościej się nie da.

Tak?

<?php define('basePath', 'php'); ?>
(...)
<?php echo '<a href="'. basePath .'/index-en.php" class="link main-menu__link main-menu__link--current-page">Home</a>'; ?>

Zaznaczę – nie chcę robić tego tak, żeby tylko działało. Chcę zrozumieć każde działanie PHP. Jeśli się nie da, to się nie da, trudno – ale muszę wiedzieć dlaczego, to znaczy: znać wszystkie możliwości i ich konsekwencje.

0

Nie nie tak, już Ci pisałem wyżej jak, sorry, ale moim zdaniem jakoś mało ogarnięty jesteś. Over & Out.

0

! Działa. Udało się.

Co się stało? Zamiast pisać ./php lub php, napisałem /php.

Człon localhost nie jest powielany, człon php nie jest powielany, ścieżek bezwzględnych nie ma, dodatkowego parsowania ścieżek nie ma. Super. :)

Trochę zdrowia i czasu straciłem, ale wrzucam to w koszty nauki – przy czym charakter jaki mam, taki mam.

Gdyby ktoś znalazł jakiś artykuł, czy specyfikację, dlaczego tak jest – bardzo proszę o informację. (Dlatego też nie zamykam jeszcze tego wątku).

1
Silv napisał(a):

! Działa. Udało się.

Co się stało? Zamiast pisać ./php lub php, napisałem /php.

Człon localhost nie jest powielany, człon php nie jest powielany, ścieżek bezwzględnych nie ma, dodatkowego parsowania ścieżek nie ma. Super. :)

Trochę zdrowia i czasu straciłem, ale wrzucam to w koszty nauki – przy czym charakter jaki mam, taki mam.

Gdyby ktoś znalazł jakiś artykuł, czy specyfikację, dlaczego tak jest – bardzo proszę o informację. (Dlatego też nie zamykam jeszcze tego wątku).

Pierwszy zapis tzn ./php oraz drugi php przy przechodzeniu po ścieżkach w linuksie mówią:
"w tym folderze w którym się znajdujesz, wejdz do folderu php"
Natomiast trzeci zapis /php mówi:
"wróć do głównego katalogu i wejdź do folderu php"
Różnica jest znacząca ;)

0

Dzięki, @mefsh. I teraz pytanie, czemu ja od razu tego nie skojarzyłem…

0

Super! Tylko, że teraz jak ktoś sobie postawi na localhost Twoją stronę w katalogu - np. "strona" - to URL będzie wyglądał: "http://localhost/strona".
W takim wypadku już nie zadziała Twoja metoda.

0

W takim wypadku już nie zadziała Twoja metoda.

Dlaczego? Przecież potrzebne foldery będą w strona/., a więc po prostu wszędzie doda się jeden człon?


UPDATE: Chociaż… nie, ja nie będę się wypowiadał, mnie już się w głowie miesza od tych ścieżek w PHP, Apache i HTML.

W takim razie, @sintloer, jakie znasz inne rozwiązanie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1