Przyjazne SEO adresy URL w Yii2

  1. Podstawowy szablon
  2. Ukryj folder internetowy
  3. Zaawansowany szablon
  4. Linki z zaplecza do frontendu
  5. Ciągnięcie ukośnika
  6. Konfigurowanie Apache bezpośrednio
  7. Zasady

Ten samouczek zawiera informacje na temat konfiguracji Apache i konfiguracji Yii2 w celu uzyskania przyjaznych dla użytkownika i przyjaznych dla wyszukiwarek adresów URL dla Twojej aplikacji internetowej.

Podstawowy szablon

Urzędnik Yii2 dokumentacja ma stronę o konfiguracji hostingu współdzielonego, która stanowi przykład tego, jak można skonfigurować Apache dla przyjaznych SEO adresów URL przy użyciu pliku .htaccess.

Opcje + FollowSymLinks IndexIgnore * / * RewriteEngine na # jeśli istnieje katalog lub plik, użyj go bezpośrednio RewriteCond% {REQUEST_FILENAME}! -F RewriteCond% {REQUEST_FILENAME}! -D # w przeciwnym razie przekaż go do index.php RewriteRule. index.php

Następnie musisz skonfigurować urlManager w pliku config / web.php.

$ config = [// ... 'components' => ['urlManager' => ['class' => 'yii web UrlManager', 'showScriptName' => false, 'enablePrettyUrl' => true,], // ...

Jeśli aplikacja znajduje się w folderze głównym, trasy będą wyglądać mniej więcej tak: http://twojadomena.com/web/site/index, w przeciwnym razie jeśli aplikacja Yii2 znajduje się w podfolderze, mogą wyglądać tak : http: // twoja_domena .com / app / web / site / index .

Ukryj folder internetowy

Możesz pozbyć się części internetowej adresu URL, przenosząc wszystkie pliki z folderu sieciowego do folderu głównego aplikacji i zmieniając ścieżki w pliku index.php, ale ta metoda będzie mieszać zawartość folderu / assets / i / / web / assets / folder. Dlatego to rozwiązanie jest lepiej dostosowane do zaawansowanego szablonu aplikacji, chyba że chcesz przenieść cały kod wraz z folderem dostawców do osobnego folderu, takiego jak Yii 1.x.

Lepszym sposobem rozwiązania tego problemu jest dodanie dodatkowego pliku .htaccess do katalogu głównego aplikacji.

Opcje -Indexes RewriteEngine na RewriteRule ^ (. *) $ Web / $ 1 [L]

Zauważ, że będzie to działać tylko wtedy, gdy w katalogu internetowym znajduje się wspomniany wcześniej plik .htaccess. W przeciwnym razie żądanie zostanie przechwycone w wewnętrznej pętli przekierowania.

Istnieje wiele stron internetowych, które pokazują podobne konfiguracje, które są bardziej złożone. Ponieważ przekierowujemy wszystkie żądania do folderu sieciowego, nie ma potrzeby odmawiania dostępu do plików, które zaczynają się od kropki, plików JSON i tym podobnych. W podstawowym szablonie nie ma żadnego z tych plików w folderze internetowym. Dla zaawansowanego szablonu możesz odmówić dostępu do plików dotf, dodając te linie.

<Files ~ "(^ | /))>> Pozwól na zamówienie, odrzuć Odmów od wszystkich </Files>

Teraz musimy powiedzieć Yii, że nasz podstawowy adres URL się zmienił. Robimy to konfigurując baseUrl dla urlManager i komponent żądania w config / web.php.

$ config = [// ... 'components' => ['urlManager' => ['class' => 'yii web UrlManager', 'showScriptName' => false, 'enablePrettyUrl' => true, 'baseUrl '=>' / ',],' request '=> [' baseUrl '=>' ', // ...], // ...

Jeśli twoja aplikacja znajduje się w podfolderze, umieść nazwę podfolderu w parametrze baseUrl 'baseUrl' => '/ app',.

Zaawansowany szablon

Możemy skonfigurować zaawansowany szablon podobnie jak podstawowy szablon. Pliki .htaccess w folderach internetowych będą takie same. Jednak plik .htaccess dla folderu głównego będzie inny, aby umożliwić żądania do aplikacji zaplecza.

Opcje -Indexes RewriteEngine na # jeśli żądanie nie jest do backendu, przekieruj go do / frontend / web RewriteCond% {REQUEST_URI}! ^ / Backend RewriteRule ^ (. *) $ / Frontend / web / $ 1 [L] #otherwise route żądanie do backendu RewriteRule ^ backend /(.*)$ backend / web / $ 1 [L]

Reguły te nie powodują pętli przekierowania, ponieważ żądanie jest przepisywane przez reguły w pliku .htaccess katalogu WWW .

Nie zapomnij skonfigurować baseUrl dla komponentu żądania i urlManager.

Linki z zaplecza do frontendu

Oficjalna dokumentacja sugeruje, że aby utworzyć linki z aplikacji zaplecza do aplikacji frontendowej oraz z aplikacji frontendowej do aplikacji backendowej, musimy skonfigurować dodatkowy komponent kend urlManagerBac dla aplikacji frontendowej.

'urlManager' => ['class' => 'yii web UrlManager', 'baseUrl' => '', 'enablePrettyUrl' => true, 'showScriptName' => false,], 'urlManagerBackend' => [' class '=>' yii web UrlManager ',' baseUrl '=>' / backend ',' enablePrettyUrl '=> true,' showScriptName '=> false,],

Oraz dodatek urlManagerFrontend dla aplikacji zaplecza.

'urlManager' => ['class' => 'yii web UrlManager', 'baseUrl' => '/ backend', 'enablePrettyUrl' => true, 'showScriptName' => false,], 'urlManagerFrontend' => ['class' => 'yii web UrlManager', 'baseUrl' => '', 'enablePrettyUrl' => true, 'showScriptName' => false,],

Następnie możesz ich używać w następujący sposób: $ frontendUrl = Yii :: $ app-> urlManagerFrontend-> createUrl (['site / index']);

Jest to świetne, gdy nie masz żadnych reguł URL, w przeciwnym razie nie tylko będziesz musiał duplikować wszystkie reguły, ale będziesz też musiał je zmieniać w dwóch miejscach. Aby tego uniknąć, możesz zapisać konfigurację dla urlManagers w osobnych plikach i załadować ją za pomocą funkcji require.

'urlManager' => require ('urlmanager.php'), 'urlManagerBackend' => require ('../../ backend / config / url-manager.php'),

Dla zaplecza:

'urlManager' => require ('urlmanager.php'), 'urlManagerFrontend' => require ('../../ frontend / config / url-manager.php'),

W ten sposób możesz zachować konfigurację w plikach url-manager.php.

&lt;? php return ['class' => 'yii web UrlManager', 'showScriptName' => false, 'enablePrettyUrl' => true,];

Ciągnięcie ukośnika

Jeśli kiedykolwiek korzystałeś nibbler mógłbyś otrzymać powiadomienie o problemie z końcowym ukośnikiem.

Możesz to naprawić, dodając te dwie linie do pliku /web/.htaccess bezpośrednio po RewriteEngine na :

RewriteCond% {REQUEST_FILENAME}! -D RewriteRule ^ (. *) / $ / $ 1 [L, R = 301]

Konfigurowanie Apache bezpośrednio

Pliki .htaccess są wygodne, ponieważ można je spakować razem z aplikacją i ponieważ nie trzeba ponownie uruchamiać Apache po zmianie czegoś w pliku .htaccess, aby zmiany zaczęły obowiązywać. Ale musisz także zapłacić za wydajność, ponieważ Apache musi skanować pliki .htaccess przy każdym żądaniu. Aby tego uniknąć, możesz skonfigurować Apache z httpd.conf.

Oto przykładowa konfiguracja, której użyłem do wirtualnego hosta na komputerze z systemem Windows.

<VirtualHost *: 80> ServerAdmin webmaster @ mytestapp DocumentRoot "C: wampir www mitestapp frontend Strona internetowa" ServerName mytestapp ErrorLog "logs / mytestapp-error.log" CustomLog "logs / mytestapp-access.log" wspólny alias / admin "C: wampir www testestapp end WWW" <Directory "C: wampir www testestapp front web"> RewriteEngine on RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule. index.php AllowOverride None Order allow, deny Allow from all </Directory> <Directory "C: wampe www mitestapp end WWW"> RewriteEngine on RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! - d RewriteRule. index.php AllowOverride None Order allow, odmowa Allow from all </Directory> </VirtualHost>

Zauważ, że w tej konfiguracji aplikacja zaplecza jest dostępna za pośrednictwem trasy / admin.

Zasady

Teraz, kiedy mamy już konfigurację, możemy zacząć ulepszać nasze adresy URL.

'urlManager' => ['class' => 'yii web UrlManager', 'baseUrl' => '/', 'enablePrettyUrl' => true, 'showScriptName' => false, 'enableStrictParsing' => true, ' rules '=> [' / '=>' site / index ',' about '=>' site / about ',' contact '=>' site / contact ',' login '=>' site / login ',' logout '=>' site / logout ',' captcha '=>' site / captcha ',' signup '=>' site / signup ',' request-password-reset '=>' site / request-password-reset ' , 'reset-password' => 'site / reset-password',],],

'enableStrictParsing' => true, mówi Yii2, aby zezwalał tylko na trasy wymienione w regułach. Do Ciebie należy decyzja, czy tego chcesz, czy nie.

Wkrótce pojawi się samouczek dotyczący zaawansowanego trasowania za pomocą urlManager.

Związane z

Lt;?