I need configure my Yii2 UrlManager rules like this:
change http://domain/site/action to http://domain/action
change http://domain/module/default to http://domain/module
so far what I have done:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<module:(!site)>' => '<module>/default',
'<action:\w+>' => 'site/<action>',
],
],
when I trying access module it return 404. But when I remove '<action:\w+>' => 'site/<action>', access module again will show as module/default page. So how to solve this?
You can try this code
'<action:(about|contact)>' => 'site/<action>',
insted of this
'<action:\w+>' => 'site/<action>',
and it will not work then change sequence of rules
'rules' => [
'<action:\w+>' => 'site/<action>', <-----------it will be first
'<module:(!site)>' => '<module>/default',
],
Related
I have the following URLs:
http://test.local/index.php?r=site%2Findex&slug=blog-detail
http://test.local/index.php?r=site%2Findex&slug=blog
http://test.local/
I want to get:
http://test.local/blog
http://test.local/blog-detail
http://test.local/
I am sending all requests to SiteController::actionIndex($slug), I am using Basic Application Template.
So far, I have been able to hide index.php and site/index.
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<slug\w+>' => 'site/index',
],
]
But it seems \w+ does not match strings with -. Also if slug is empty it should show: http://test.local/.
\w does not match -. You need to use [\w\-] instead. And + requires at least one char in your case. You should use * instead:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'<slug:[\w\-]*>' => 'site/index',
],
]
What you are trying to make is make specific url based on GET param. With the following example if the user enters url test.local/Some-nice-article then the SiteController::actionIndex($slug) function will get the param.
'urlManager' => [
'pattern' => '<slug>',
'route' =>'site/index',
'ecnodeParams' => false,
//class => any\custom\UrlRuleClass,
//defaults => []
]
Or you want another url to specify whether it is detailed view? You can do it this way:
'urlManager' => [
'pattern' => '<slug>-detail',
'route' =>'site/detail',
'ecnodeParams' => false,
//class => any\custom\UrlRuleClass,
//defaults => []
]
In this example, if the users puts the string '-detail' at the of the slug, then it will parse the route SiteController::actionDetail($slug) to the request.
Please note that if you did not yet, enable prettyUrls in the config file
You can find a little more about this topic in this answer or in the Yii2 definitive guide
I'm trying to remove action name from url. 'post/view' to 'page' using urlManager but it's not working
'urlManager' => [
'class' => 'yii\web\UrlManager',
// Hide index.php
'showScriptName' => false,
// Use pretty URLs
'enablePrettyUrl' => true,
'rules' => [
//'<view:\w+>' => 'post/<alias>',
//'<alias:view>' => 'post/<alias>',
'page' => 'post/view',
],
],
Change your config to include the id:
'page/<id>' => 'post/view'
Allows you to use urls like this:
localhost:8585/yii2basic/wfp/web/page/PGr1mtIkAE
You can't really do this:
localhost:8585/yii2basic/wfp/web/post/id=PGr1mtIkAE
How can I create a pretty url like this
customer/index/amount/12000/location/in . In Yii1.1 it was available by default. it was easy to enable pretty url. In Yii2 if need pretty url I've to write rules for every action !!!
In Codeigniter you will get index.php/controller/action/parameter1/parameter2/parameter3
ie it does not expose action parameter variables, that too without writing any url rules!
===Edit===
pretty URL doesnt work for parameters if no rule is defined
below is my main.php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [ '<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
],
],
i am getting a lot of 404's, like
192.168.1.3/~user/urshow/frontend/web/movies/movies_all
it would have work fine if it would be like this
192.168.1.3/~user/urshow/frontend/web/index.php?r=/movies/movies_all
Go to config.php and add
'components' => [
...
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
],
...
],
I am facing a grate problem in my project.
When i browse url with my project name than it's show folders, but i don't want to show those folder i want to show direct my web site, like 'localhost/mywebsite/admin'.
I also try to solve this problem to add my backend/config/main.php file
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => 'false'
],
but it does not work.
Please help me to solve this problem.
Customize URL:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
'<_c:[\w\-]+>' => '<_c>/index',
'<_c:[\w\-]+>/<_a:[\w\-]+>' => '<_c>/<_a>',
'<_c:[\w\-]+>/<_a:[\w\-]+>/<id:\d+>' => '<_c>/<_a>',
],
],
In apache.conf input DocumentRoot /var/www/backend/web.
I can't show static pages. Try do it as described in doc here - http://stuff.cebe.cc/yii2-guide.pdf (on page 100) but when I enable prettyurl, it doesn't work.
Added in urlManager rules:
'urlManager' => array(
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => array(
'' => 'site/index',
'login' => 'site/login',
'contacts' => 'site/contact',
'<view:(break)>'=>'/site/page?&view=<view>',
),
),
then in SiteController added:
public function actions()
{
return [
...
'page' => [
'class'=>'yii\web\ViewAction',
],
];
}
And then created views/site/pages/break.php
<h1>View static page Break</h1>
But I get an error:
Not Found (#404)
Unable to resolve the request: site/page?&view=break
If i disable prettyUrl:
//'enablePrettyUrl'=>true
then i can see my page typing url: index.php?r=site/page&view=break
What's wrong with ViewAction?
I think you are doing the rules part of your url manage wrong.
Try this
'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>',
),
],
The rules part should be important..
I solved my problem. use such lines:
'<view:(break)>' => 'site/page',
'<controller:\w+>/<id:\d+>' => '<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
I force use specific name of page for view, in my case it "break", because can't use this
'<view:[a-zA-Z0-9-]+>' => 'site/page',
(it causes crashing other rules.) I think it could better create "own rule class" extending UrlRule, but think that now I don't need this.
I had tried this way (without rules specification) :
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => 'false'
],
Solution is simple:
web.php code is like this 'rules' => [
'site/page/<view:[a-zA-Z0-9-]+>' => 'site/index',
In SiteController don't use function actions(), instead:
public function actionIndex ($view)
{
return $this->render('/site/pages/' . $view);
} catch (InvalidParamException $e) {
throw new HttpException(404);
}.
If view contacts.php exists in views/site/pages/ , url is yourdomain/basic/web/site/page/contact
4.Thanks to samdark and it's article https://github.com/yiisoft/yii2/issues/2932