Karthik Malla
Karthik Malla

Reputation: 5820

Htaccess URL rewrite to Yii2 application

I have the following url structures in my Yii2 application

http://127.0.0.1/frontend/web/index.php?r=site%2Flogin
http://127.0.0.1/frontend/web/index.php?r=site%2Fpage2
http://127.0.0.1/frontend/web/index.php?r=site%2Fsample
http://127.0.0.1/frontend/web/index.php?r=site%2Fsignup

How can I convert that URL to something like

http://127.0.0.1/login.php
http://127.0.0.1/page2.php
http://127.0.0.1/sample.php
http://127.0.0.1/signup.php

I should remove frontend/web/index.php?r=site%2F

I tried like and it didn't work

Options -Multiviews

RewriteEngine On
RewriteBase /

# Force search engines to use http://127.0.0.1/frontend/web/
RewriteCond %{HTTP_HOST} !^http://127\.0\.0\.1/frontend/web/$
RewriteRule ^(.*) http://127.0.0.1/frontend/web/$1 [R=301,L]

# Specify search friendly URLs
RewriteRule ^login\.php$ /index.php?r=site%2Flogin [L]

I also tried like and it didn't work too.

RewriteEngine on
RewriteRule ^frontend/web/index.php?r=site%2F([^\./]+) /$1.php [L]

Upvotes: 0

Views: 1289

Answers (1)

arogachev
arogachev

Reputation: 33548

No need to change .htaccess to achieve this. Adjust urlManager component. Add this to your application config:

'components' => [
    'urlManager' => [
        'enablePrettyUrl' => true, // Cancel passing route in get 'r' paramater
        'showScriptName' => false, // Remove index.php from url
        'suffix' => '.php', // Add suffix to all routes (globally)
    ],
    // Compare requested urls to routes
    'rules' => [
        'login' => 'site/login',
        'page2' => 'site/page2',
        'sample' => 'site/sample',
        'signup' => 'site/signup',
    ],
],

As for removing controller part from all other routes - it violates key MVC concepts.

How you define to which controller requested action belongs in that case?

And what in case of actions with the same name?

For example: http://127.0.0.1/create.php - should it load site/create or users/create?

Also I don't sure if it's good practice, but you can write comparisons to all routes the same way with rules, but all action names should be unique.

Conclusion: you can modify urls to desired view as I mentioned above, but omitting controller names is only recommended for default controller (SiteController).

Official documentation:

Upvotes: 1

Related Questions