Jak odebrat veřejnou z adresy URL projektu laravel (laravel instalace)

Situace

V celé doméně bychom chtěli adresy URL skrýt přípony souborů a odstranit koncová lomítka, nezávisle na samotném názvu domény (jako v, funguje na jakékoli doméně).

Ukázka naší adresářové struktury

Nepoužíváme soubory indexu * kromě domovské stránky.

  • /
    • /index.php
    • /account.php
    • /účet
      • /subscriptions.php
    • /login.php
    • /přihlásit se
      • /reset-password.php

Cíl

Několik příkladů, jak mohou být tyto soubory požadovány a jak by měly vypadat v prohlížeči:

  • / a index.php --> mydomain.com (doslova jen holý název domény).

  • /account.php nebo /account/ nebo /account --> mydomain.com/account

  • /account/subscriptions.php nebo /account/subscriptions/ nebo /account/subscriptions --> mydomain.com/account/subscriptions

Jak vidíte, existuje několik způsobů, jak přistupovat ke každé webové stránce, ale bez ohledu na to, který ze 2 nebo 3 způsobů, jak se tam dostat, se v prohlížeči zobrazí pouze jedna preferovaná adresa URL.

Otázka

Jak je to provedeno s .htaccess pomocí mod_rewrite?

Bouchl jsem hlavou o zeď a snažil jsem se na to přijít, ale obecně by se tok přepsání zdál být něco jako toto:

  1. Externí přesměrování 301 ( mydomain.com/account/ --> mydomain.com/account )
  2. Interně přidat .php ( mydomain.com/account --> mydomain.com/account.php )

Celý den jsem Googloval, četl tisíce řádků dokumentace a konfiguračních textů a několikrát jsem to zkoušel ... Myslím, že více mozků by tomu hodně pomohlo.

AKTUALIZACE

Našli jsme odpověď na naši otázku (viz níže).

  • Jak byste rozlišovali mezi account.php a účtem / složkou? K tomu slouží koncové lomítko.
  • Dobrá otázka. Jsou to samé. Složka „účet“ se přepíše na „account.php“. (Tuto strukturu často najdete ve webových projektech sady Visual Studio.)
  • Co? Je mi líto, to mi nedává smysl. Pokud existuje soubor /account.php a soubor /account/index.php (obvykle přístupný jednoduše pomocí / account /), jak mezi nimi rozlišujete? V souborovém systému ano ne ta samá věc. Pokud vše bootujete pomocí jediné složky index.php, jako to dělají rámce PHP, pak to možná dává smysl. Myslíš tím?
  • Promiň, měl jsem být jasnější. Nebudeme používat indexové soubory (kromě domovské stránky; ale u této otázky si s tím nedělejte starosti). Všechny názvy souborů popisují jejich obsah. To například znamená, že /account/ přepíše na /account a skutečně doručit /account.php, ne /account/index.php.

Děkujeme za váš čas podívat se na otázku, ale zdálo se, že jsme na to přišli:

Options -Multiviews -Indexes +FollowSymLinks RewriteEngine On RewriteBase / DirectorySlash Off # remove trailing slash RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L] # rewrite /dir/file?query to /dir/file.php?query RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php] 

Musíme vypnout Multiviews a Indexy, aby se motor nezměnil, a místo toho se pokusit na jakýkoli odkazovat index.* Pokud se zdá, že je adresář požadován, vytvořte soubor nebo zobrazte seznam adresářů (také zmateně nazývaný „index“ s Apache ...).

První přesměrování viditelně (R=301) odstraní koncové lomítko a druhé jej interně přepíše na soubor PHP (nebo HTML atd.).

Tento soubor .htaccess podporuje také řetězce dotazů.

Aktualizace Jak je uvedeno v komentářích mnohem dříve, přešli jsme na nginx a to je vše, co náš soubor conf obsahuje týkající se přepisování URL (z mého dev boxu):

location = / { index index.html; } try_files $uri $uri.html =404; 

Také jsme přešli z PHP na obyčejné HTML, ale změna výše uvedených rozšíření by sotva měla něco změnit, pokud vůbec.

  • Při zpětném pohledu jsme přešli na nginx a celý tento úkol byl SUPER-snadný ...
  • Menší bod, ale nemusíte uniknout lomítku (/) v regulárním výrazu, protože nemá žádný zvláštní význam. \/ je stejné jako '/'.
  • @ w3d Dobrá poznámka. To je zvyk z mého Javascriptového regex'ingu.

Proč chcete přesměrovat / účet na /account.php? Stránka / účet ve skutečnosti existuje pouze s vyjednáváním obsahu. Pokud to nechcete, jednoduše deaktivujte direktivu.

O vašich dvou pravidlech si myslím, že je to jednoduché:

RewriteRule ^/account/$ /account RewriteRule ^/account$ /account.php [R,L] 

Není však vyzkoušeno. Můžete také přidat [R,L] na první řádek, v tomto případě prohlížeč provede ještě jedno přesměrování.

  • 1 Teoreticky je to obecná myšlenka (kromě toho, že nechceme v prohlížeči zobrazovat .php), ale to by fungovalo pouze pro account.php. Doufáme v obecné řešení, které funguje na celém webu. Pomocí refiddle otestujeme naše regulární výrazy, my znát ten regulární výraz je jako ^(.*)/$ označte adresy URL s koncovým lomítkem, ale zdá se, že to má účinek pouze v adresářích nejvyšší úrovně, nikoli v podadresářích. (Požadavky na podadresáře přepisují s úplnou cestou k serveru v URL a z nějakého důvodu se zobrazí v prohlížeči.) Jsme si také jistí, že ^(.*)[^/]$ označuje URL bez koncového lomítka.

Pokud byste chtěli flexibilní a jednoduchý způsob směrování požadavků na URL pro váš web nebo aplikaci, doporučil bych mikrorámce PHP. Nejen, že budete mít úplnou kontrolu nad směrováním adres URL, ale bude to mít i další výhody.

Slim Framework jsem už dříve používal v kombinaci s komponentou Symfony Templating Component se skvělými výsledky. Kdybych to udělal znovu, pravděpodobně bych použil pouze Micro-framework Silex, protože je také součástí Symfony Components.

  • Přemýšleli jsme o něčem takovém (díky za odkazy), ale naše vývojová verze webu je poháněna PHP a nasazená produkční stránka je 100% statická (bez PHP). Tento soubor .htaccess bude před nasazeným produkčním webem.
  • Bylo by velmi snadné rychle vytvořit statický web založený na těchto mikrorámcích. Projekt, pro který jsem je použil, byl většinou statický obsah, jen s úvodním PHP, které se používalo k zavedení webu pomocí mikro-rámce. V závislosti na velikosti webu může být jeho převedení na použití mikrorámce rychlejší než celodenní bouchání hlavou proti .htaccess.

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?