#php #yii2
#php #yii2
Вопрос:
Я пытаюсь создать статическую страницу с помощью Yii2. Название страницы содержит больше двух слов, например — политика конфиденциальности. Я добавил приведенный ниже код внутрь SiteController.php
public function actionPrivacyPolicy()
{
return $this->render('privacy-policy');
}
Затем я создал страницу внутри папки сайта с именем — privacy-policy.php
Однако это привело к ошибке «страница не найдена».
На моем сайте есть много подобных случаев. Каков наилучший способ исправить это?
Комментарии:
1. если вы включили
enablePrettyUrl=>true
, то вам следует ввестиhttp://yoursite.com/site/privacy-policy
, если нет, тоhttp://yoursite.com/index.php?r=site/privacy-policy
и вам не нужно сопоставлятьview
имя сaction
, это может быть что угодно.2. @Мухаммад Омер Аслам . Да, я включил I
enablePrettyUrl=>true
. Я протестировалhttp://yoursite.com/site/privacy-policy
, и это сработало! Но я в замешательстве, потому что я добавил правило, от которого'<alias:w >' => 'site/<alias>',
нужно избавитьсяsite
в URL, и оно работает для ссылок с одним словом. Например, обаhttp://yoursite.com/site/contact
иhttp://yoursite.com/site/contact
работают, ноhttp://yoursite.com/privacy-policy
безsite
выдает страницу не найдена. Возможно, я делаю что-то неправильно. Есть идеи, пожалуйста?3. добавлен ответ, смотрите ниже
Ответ №1:
Вам необходимо получить доступ к URL, как показано ниже, если вы используете "enablePrettyUrl"=>true
http://yoursite.com/site/privacy-policy
и
http://yoursite.com/index.php?r=site/privacy-policy
если не использовать "enablePrettyUrl"=>true
после этого вам нужно проанализировать все действия в SiteController
только по именам действий, поэтому вам нужно включить "enableStrictParsing"=>false
, а затем добавить следующее правило в urlManager
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
"enableStrictParsing" => false,
'rules' => [
"/" => "site/index",
"<action:(.*)>" => 'site/<action>',
],
],
Редактировать:
Хотя это допускает символы, которые разрешены / не должны быть разрешены, но причина, по которой я использовал (.*)
в правилах, заключается в том, что имя действия будет определено внутри контроллеров, и вы должны использовать правила с объявленными действиями только внутри SiteController
, который не собирается анализировать имя действия для правил с любым из запрещенных символов, означает, что если имя действия будет, скажем, actionMyActionNameLong
, есть вероятность 0, что любое /
или
генерируется с именем действия, что приведет к дальнейшим нарушениям при использовании правила , так что вы можете использовать его в этом контексте, в противном случае вы можете использовать [w-]
при создании URL-адресов вручную.
Комментарии:
1. можете ли вы взглянуть на вклад rob006 ниже? Вы рассматривали поднятый вопрос? Я думаю, вы можете захотеть доработать этот ответ, чтобы не создавать проблем в будущем для других.
2. @atsngr, rob006 ответил в контексте данного токена,
w
который вы использовали, который допускает только любой символ слова , а не-
тот, который является правильным в соответствии с его ответом. В то время как.*
совпадения с любым символом (за исключением символов завершения строки) таким образом, технически(.*)
будет перехватываться все, что[w-]
захватывается, разве это не работает правильно для вас?3. очень хорошо. Ваш ответ заставил меня пересмотреть конфигурацию моего проекта.
Ответ №2:
Шаблон <alias:w >
не будет соответствовать дефису, поскольку w
будет принимать только буквы, цифры и подчеркивание. Вам нужно использовать [w-]
для сопоставления также слов, разделенных дефисом.
'rules' => [
'<alias:[w-] >' => 'site/<alias>',
// ...
],
Комментарии:
1. Спасибо за это. Но ответ @Muhammad Omer Aslam сделал свое дело.
2. @atsngr В его ответе
(.*)
используется в качестве шаблона, что неверно — он будет перехватывать все возможные символы (включая/
), что неверно в данном контексте. Его правило в основном нарушает запасной вариант по умолчанию и все последующие правила.3. Я тоже протестировал ваш код, и он тоже сработал. Учитывая, что вы уже подумали о возможном влиянии дальнейших правил, я думаю, что ваш вклад очень важен
Ответ №3:
Я думаю, вы можете настроить urlManager в main.php в папке config и попробуйте добавить некоторые правила в urlManager, чтобы к URL можно было получить доступ динамически
'urlManager' => [
"enablePrettyUrl" => true,
"showScriptName" => false,
"enableStrictParsing" => false,
"suffix" => "",
"rules" => [
"<controller:w >/<action:w >" => "<controller>/<action>"
],
],
Если вы используете yii filters AccessControl в поведении ваших контроллеров, вам может потребоваться добавить разрешенное действие в список перед созданием нового действия.
Комментарии:
1. Пожалуйста, посмотрите мой комментарий выше.