how to remove url (/web/index.php) yii 2 and set route with parameter with clean url?
Solution 1
For advanced application follow these steps:
1) Add the following htaccess
to frontend/web
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php
2) Add the following htaccess
to root folder
where application is installed
# prevent directory listings
Options -Indexes
IndexIgnore */*
# follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^admin(/.+)?$ backend/web/$1 [L,PT]
RewriteRule ^(.+)?$ frontend/web/$1
3) Edit your frontend/config/main.php
file with the following at the top
use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '', (new Request)->getBaseUrl());
4) Add the request component
to the components array in the same file i.e frontend/config/main.php
'components' => [
'request' => [
'baseUrl' => $baseUrl,
],
],
That's it.Now you can access the frontend without web/index.php
For you second question you need to write the rule for it in your URL manager component.
Something like this:
'urlManager' => [
'baseUrl' => $baseUrl,
'class' => 'yii\web\UrlManager',
// Disable index.php
'showScriptName' => false,
// Disable r= routes
'enablePrettyUrl' => true,
'rules' => array(
'transaction/getrequestdetail/<id>' => 'transaction/getrequestdetail',
),
],
Solution 2
If it still isn't working after going through the answers above, then you can edit your 'apache2.conf' file in your favorite editor to change
AllowOveride None to AllowOveride All
On Ubuntu, the file is located at /etc/apache2/apache2.conf
The final edit should look like
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Finally, restart the Apache server
Solution 3
You can add the information in file configuration to remove /web:
$baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());
return [
...
'components' => [
'request' => [
'baseUrl' => $baseUrl,
],
...
]
]
randawahyup
Updated on June 19, 2022Comments
-
randawahyup almost 2 years
first question: i already remove
index.php
, but i want remove/web
also. this is my.htaccess
RewriteEngine on # If a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Otherwise forward it to index.php RewriteRule . index.php
and this is
config/web.php
'urlManager' => [ 'class' => 'yii\web\UrlManager', // Disable index.php 'showScriptName' => false, // Disable r= routes 'enablePrettyUrl' => true, 'rules' => array( '<controller:\w+>/<id:\d+>' => '<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', '<controller:\w+>/<action:\w+>' => '<controller>/<action>', ), ],
it's working fine, but it's still using
/web
. is it possible remove/web
?second question:
i can't set route with parameter with that clean url, my route
Url::toRoute(['transaction/getrequestdetail/', 'id' => 1 ]);
how the route should be ? and how with 2 parameter route ?
-
Van Pham almost 9 yearsYou can change htaccess: Options -Indexes <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !^web RewriteRule ^(.*)$ web/$1 [L] </IfModule> # Deny accessing below extensions <Files ~ "(.json|.lock|.git)"> Order allow,deny Deny from all </Files> # Deny accessing dot files RewriteRule (^\.|/\.) - [F]
-
randawahyup almost 9 yearsstill "object not found", can you write .htaccess in your answer ? (edit your answer). i maybe I mistyped.
-
Van Pham almost 9 yearsYou can move $baseUrl in config to ... 'urlManager' => [ 'baseUrl' => $baseUrl, 'class' => 'yii\web\UrlManager', ...]
-
randawahyup almost 9 yearsthank's for answer bro, but i still have trouble with second question. the url result still: localhost/transmansys/objecttransaction/index&id=100049 with that rules. i need url result be: localhost/transmansys/objecttransaction/index/100049. and how about url with 2 or more parameter ?
-
randawahyup almost 9 yearssolved bro, i just need add " / " after <id> in your rules lol. thank you very much dude :D
-
BlackSkull about 8 years@Chinmay what if I have a basic template. how I would write the number 2? I hope you might answer. thanks
-
Chinmay Waghmare about 8 years@BlackSkull I have not used basic template as yet. But is shouldn't be that hard. This link might help you: yiiframework.com/forum/index.php/topic/…
-
Mehdi about 7 yearsThe perfect solution. Thanks @Chinmay
-
Francis Ngueukam over 6 yearsIt s working perfectly, even for basic template.Thanks
-
rob006 almost 6 yearsThis may break some URLs, see explanation and alternative in my answer
-
Luis Contreras about 5 yearsThis is the solution