Introduction
If you develop rather complex applications with Yii2, you might already be familiar with yii2-app-advanced application template. Well, the template is awesome and provides high flexibility regarding code/configuration sharing among parts of an application.
What is not obvious for this template, is how to configure a web server so that both, frontend and backend will be accessible on the same domain, like following:
http://example.com/
- frontendhttp://example.com/backend/
- backend
Solution
To achieve our goal, we need to slightly modify backend configuration, as well as to alter the web server's configuration.
Yii configuration
We need to "teach" the application components request
and urlManager
about our intended URL structure.
Frontend
Modify file frontend/config/main.php
:
.... 'components' => [ .... 'request'=>[ 'baseUrl'=>'', ], 'urlManager'=>[ 'scriptUrl'=>'/index.php', ], // use the following, if you want to enable speaking URL for the frontend // 'urlManager' => [ // 'enablePrettyUrl' => true, // 'showScriptName' => false, // ], ],
Backend
Modify file backend/config/main.php
:
.... 'components' => [ .... 'request'=>[ 'baseUrl'=>'/backend', ], 'urlManager'=>[ 'scriptUrl'=>'/backend/index.php', ], // use the following, if you want to enable speaking URL for the backend // 'urlManager' => [ // 'enablePrettyUrl' => true, // 'showScriptName' => false, // ], ],
Apache (.htaccess with mod_rewrite)
Create a file .htaccess
in the project root directory (where composer.json
is):
RewriteEngine On # End the processing, if a rewrite already occurred RewriteRule ^(frontend|backend)/web/ - [L] # Handle the case of backend, skip ([S=1]) the following rule, if current matched RewriteRule ^backend(/(.*))?$ backend/web/$2 [S=1] # handle the case of frontend RewriteRule .* frontend/web/$0 # Uncomment the following, if you want speaking URL #RewriteCond %{REQUEST_FILENAME} !-f #RewriteCond %{REQUEST_FILENAME} !-d #RewriteRule ^([^/]+/web)/.*$ $1/index.php
Nginx
Here is Nginx config, built on top of the official recommended configuration:
server { set $project_root /path/to/example.com; set $fcgi_server 127.0.0.1:9000; #set $fcgi_server unix:/var/run/php-fpm/example.socket; charset utf-8; client_max_body_size 128M; listen 80; server_name example.com; root $project_root/frontend/web; index index.php; access_log /var/log/nginx/example.access.log combined; error_log /var/log/nginx/example.error.log warn; location ^~ /backend { rewrite ^/backend(.*)$ /backend/web$1 last; } location ^~ /backend/web { root $project_root; # uncomment the following, if you want to enable speaking URL in the backend #try_files $uri $uri/ /index.php$is_args$args; location ~ /\.(ht|svn|git) { deny all; } location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass $fcgi_server; } } location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ /\.(ht|svn|git) { deny all; } location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_pass $fcgi_server; } }