I trying to enable pretty url in yii2 but it doesn't work as needed.
urlManager configuration:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
]
public function actionIndex($custom_param)
{
print($custom_param);
}
example.com/mycontroller?custom_param=value works perfectly. But I need URLs such as example.com/mycontroller/value.
If you want to apply this toindex action of mycontroller and in case of custom_param is integer, add this to rules section of urlManager:
`urlManager' => [
'rules' => [
'mycontroller/<custom_param:\d+>' => 'mycontroller/index',
],
],
Otherwise you can modify pattern to fit your needs.
For example if custom_param is string, change d+ to w+.
If you want to apply this rule to other controllers, you can do it like this:
'<controller:(mycontroller|anothercontroller)>/<custom_param:\d+> => '<controller>/index',
Read more in official documentation:
Guide to url rules
Guide to parameterizing routes
UrlManager $rules
In your web.php file below Components use this code:
'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>',
),
],
Create A .htaccess file in your web folder and paste it:
RewriteEngine on # If a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # therwise forward it to index.phpRewriteRule . index.php
Related
Suppose my application path is:-
http://www.example.com/index.php?r=dashboard/event/view
I make a new controller on which I want to change the URL to pretty URL.
Default URL for the new controller
http://www.example.com/index.php?r=newcontroller/view?id=23&name=urlpretty
I want to make above URL to pretty URL such as
http://www.example.com/23/sampleprettyurl
But I do not want to change the complete application URL path to pretty URL. My other controller path/URL should work normally.
Thanks in advance
I don't think is doable, controller name must be in the URL, get what you need to configure the module name, then the urlManager:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => false,
'rules' => [
'newcontroller/<id>/<name>' => 'moduleAlias/newcontroller',
],
],
Then in the action you can get the value by Yii::$app->request->get('id');
in config web.php
component => [
/* pretty url */
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
/* ./pretty url */
]
and .htaccess on /web
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
I use the Yii2 framework and want to remove site/index from my URLs.
Right now I have the following URL
example.com/site/index
but would like to change it to simple
example.com
I tried the following approach Yii2 How to remove site/index and page parameter from url but it doesn't work.
Could you please suggest how it can be done?
Looking at the question also asked at Yii2: Remove controller from URL
I ran into problems and I had to use the Yii2 resources as https://yii2-cookbook.readthedocs.io/enable-pretty-urls/
and this is what I got
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<action>'=>'site/<action>',
'<controller:[\w\-]+>/<id:\d+>' => '<controller>/view',
'<controller:[\w\-]+>/<action:[\w\-]+>/<id:\d+>' => '<controller>/<action>',
'<controller:[\w\-]+>/<action:[\w\-]+' => '<controller>/<action>',
],
],
You need to add rule for empty path at the beginning of your rules:
'urlManager' => [
'rules' => [
'' => 'site/index',
// rest of rules
],
],
I understand many variables outside what I can provide could be the problem, but I'm still asking if someone had this problem and could help.
Here's my UrlManager config in the components
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => false,
'showScriptName' => true,
'rules' => [
'' => 'site/index',
'member' => 'site/login',
],
],
This url works:
http://exampler.com/web/index.php?r=site/login
This url returns a 404
http://example.com/web/index.php?r=member
**NOTE: ** I don't have any messy Nginx or Apache rules on my server like this guy had. My rules seem to be completely ignored, whatever I write in them.
$rules is ignored if you set $enablePrettyUrl to false. From $rules documentation:
The rules for creating and parsing URLs when $enablePrettyUrl is true. This property is used only if $enablePrettyUrl is true.
https://www.yiiframework.com/doc/api/2.0/yii-web-urlmanager#$rules-detail
I am getting an HTTP 404 error when I try to rewrite my URL's in Yii with urlManager.
Here are two config formats I've tried in my main.php config file, one like 'pattern1'=>'route1' and the other in the new format array('route1', 'pattern'=>'pattern1'):
'urlManager' => array(
'urlFormat' => 'path',
'rules' => array(
'messageBulk'=>'message/apiBulk'
),
),
'urlManager' => array(
'urlFormat' => 'path',
'rules' => array(
array('message/apiBulk', 'pattern'=>'messageBulk')
),
),
What sort of urls are you looking to generate? Cos I'm a bit confused with the configurations you've got up there. At any rate, this is a template I use for my projects:
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
// REST patterns
array('api/list', 'pattern'=>'api/v1/<model:\w+>', 'verb'=>'GET'),
array('api/view', 'pattern'=>'api/v1/<model:\w+>/check', 'verb'=>'GET'),
array('api/view', 'pattern'=>'api/v1/<model:\w+>/<id:\d+>', 'verb'=>'GET'),
array('api/create', 'pattern'=>'api/v1/<model:\w+>', 'verb'=>'POST'),
'<controller:\w+>/<id:\d+>/'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>/*'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>/*'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>/'=>'<controller>/<action>',
'<module:\w+>/<controller:\w+>/<action:\w+>/'=>'<module>/<controller>/<action>',
),
//'showScriptName'=>false,
),
I hope it helps you out.
Was writing the URL wrong, missing "index.php". Answer was in #ernie's comment.
What's the debug panel show? What URL are you trying to access with your rules? Does your yourwebsite.com/index.php/message/apiBulk work?
Trying to work on a RESTfull API with yii (being the first project using yii)
Having problem with getting URLManager to properly route calls:
'urlManager' => array(
'urlFormat' => 'path',
'showScriptName' => false,
'caseSensitive' => false,
'rules' => array(
'api/<controller>' => array('api/<controller>/list', 'verb' => 'GET'),
'api/<controller>' => array('api/<controller>/create', 'verb' => 'POST'),
),
),
Tried working with this (this is not the full snippet, I had dispatchers for PUT/DELETE etc..
But it did not work... Being desperate, I tried even something as simple as that:
'urlManager' => array(
'urlFormat' => 'path',
'showScriptName' => false,
'caseSensitive' => false,
'rules' => array(
'tezt' => array('landing/beta', 'verb' => 'GET'),
'tezt' => array('landing', 'verb' => 'POST'),
),
),
whenever I remove one of the rules, it works, but when I put both the rules in, none of them works, I get exception
exception.CHttpException.404
exception 'CHttpException' with message 'Unable to resolve the request
"tezt".' in /yii-1.1.10/web/CWebApplication.php:280
Been banging my head agains this for 2 days now. Probably seen all the samples and tutorials on URLManager on the web (although could not find a straightforward and complete explanation of the rules). But, no joy.
Am I doing something wrong? Is it my box setup maybe?
I tried this and it worked:
'rules'=>array(
//API URLs
array('api/<controller>/index', 'pattern'=>'api/<controller:\w+>', 'verb'=>'GET'),
array('api/<controller>/create', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'),
array('api/<controller>/view', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'GET'),
array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'PUT, POST'),
array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'DELETE'),
//Other URLs
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
"api" is a module configured in modules section as
'api'=>array('defaultController' => 'default',),
In REST client, you have to specify controller name, even for default controller.
I am using Yii 1.1.10 but I think Yii supports RESTful URLs since 1.1.7.
try this
'api/<controller:\w+>' => array('api/<controller>/list', 'verb' => 'GET'),
is api a module?
For anyone else who stumbles on this, it didn't work because the rules were declared using the same keys, so the latter rule overrode the former.
In the future, declare the pattern in the rule configuration array:
array(
'route',
'pattern' =>'somePattern',
'verb' =>'...',
),
array(
'another/route',
'pattern' =>'anotherPattern',
'verb' =>'...',
),