0

私はこのチュートリアルに従いました。

私が達成したいのは次のようなものです

http://something.com/language/controller/action

しかし、私は得ています

http://something.com/controller/action?language=en&id=1

私の知る限り、ここがURL 生成の部分です。しかし、私はそれを修正する方法を理解できません。

私は何が欠けていますか?

4

3 に答える 3

2

@PanagiotisGeorgeRadiが示唆しているように、(プロジェクトルートで).htaccessを使用する必要があります。私のものはわずかに異なりますが、ベースは同じです:

RewriteEngine on

Options +FollowSymLinks
IndexIgnore */*

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php

次に、 components配列内のprotected/config/main.phpで、URL マネージャーのプロファイルを設定します。

    'urlManager' => array(
        'urlFormat' => 'path',
        'showScriptName' => false,
        'rules' => array(
            '<lang:(en|fr|it|es)>/<controller:\w+>/<action:\w+>' => '<controller>/<action>', // only these 4 lang codes
            '<lang:[a-z][a-z]>/<controller:\w+>/<action:\w+>' => '<controller>/<action>', // or a generic pattern
        ),
    ),

次に、コントローラーのアクションには次の署名があります。

class TestController{
  public function actionIndex($lang){
    // $lang will be en|fr|es|it
    // or [a-z][a-z]
  }
}

URL マネージャーを使用すると、 ifswitchなしで、サポートされている言語のみを受け入れることができます

UrlManager に関する優れたドキュメントを追加: http://www.yiiframework.com/doc/guide/1.1/en/topics.url

URL マネージャーの最も優れた点は、ページにリンクを作成することです。たとえば、次のようになります。

$url=$this->createUrl('test/index',array('lang'=>'en'));

相対パスになります: en/test/index

$url=$this->createAbsoluteUrl('test/index',array('lang'=>'en'));

プロジェクトが documentRoot にある場合は絶対 URL http://www.loc.dom/en/test/indexになり、別の場所にある場合はhttp://www.loc.dom/sub/path/en/test/indexになります。 !

于 2013-01-16T23:57:52.417 に答える
1

htaccess ファイルを使用します (htaccess に慣れていない場合は、Google のチュートリアルを確認してください)。

その中に次の行を追加します

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)(.*)$ /index.php?page=$1&request=$2

このルールを使用すると、domain.com があり、ユーザーが次の URL を要求すると仮定できます。

http://www.domain.com/news/December/politics/Titlearticle1

上記のルールは、この URL リクエストを中断して割り当てます

$_GET['page'] = 'news';

$_GET['request'] = '/December/politics/Titlearticle1';

今、あなたのphpスクリプトで

あなたは出来る

1) ページリクエストを検証する

2) $_GET['request'] を分解して、リクエストをさらに検証します

$request_parts = explode('/',$_GET['request']);

3)すべてを検証してください!これは非常に重要です。そうしないと、サイトが脆弱になる可能性があります。

そのようです:

if($_GET['page'] == 'news')
}
  include 'news.php';
{
else if ($_GET['page'] == 'home')
{
  include 'home.php';
}
  else
{
  include 'error.php';
}

これはかなり基本的な概念ですが、必要に応じて拡張できます...

于 2013-01-16T23:38:52.243 に答える
1

通常、URL マネージャー オブジェクトから defaultParams オプションを使用して、クエリ文字列パラメーターを追加/削除します。ドキュメントから:

defaultParams: このルールが提供するデフォルトの GET パラメータ (name=>value)。このルールを使用して受信リクエストを解析すると、このプロパティで宣言された値が $_GET に挿入されます。

ただし、この場合は、多言語の URL サポートを提供するために、createURL メソッドを拡張してこれらのパラメータを手動で URL の末尾に追加しています。これを気にしない場合は、params オブジェクトが空の配列に設定されていることを確認してください。

return parent::createUrl($route);
于 2013-01-16T23:30:37.677 に答える