Help us understand the problem. What is going on with this article?

HumHubのURLのGETパラメータをキレイにする

More than 1 year has passed since last update.

概要

HumHubでのpretty URLの設定方法。

関連

デフォルトでは

HumHubはデフォルトでは、以下のようなURL形式になる。

これはSEO的にも良くないので、以下のような形式にしたい。

Apacheの設定

.htaccessもしくはApacheのconfファイルに以下を追記する

.htaccessに書く場合

.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

confに書く場合

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule . /index.php

参考:httpd.conf と .htaccess でリライト設定が異なる

HumHubのconfigの設定

protected/config/common.phpのcomponentsの中に以下を追記する

'components' => [
    // ...
    'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Hide index.php
        'showScriptName' => false,
        // Use pretty URLs
        'enablePrettyUrl' => true,
        'rules' => [
        ],
    ],
    // ...
],

ProfileページのURLを修正

pretty urlを有効にすると、プロフィールページのURLにログインに使用するusernameが含まれるようになってしまう。(無効のときはguidが使用されている)
ログインIDがバレるのはセキュリティ的に良くないので、guidを使用する方式に変更する。

protected/humhub/modules/user/components/UrlRule.php

getUrlByUserGuid()メソッドは不要となるので削除します。

class UrlRule extends Object implements UrlRuleInterface
{
/* snip */

    public function createUrl($manager, $route, $params)
    {
        if (isset($params['uguid'])) {
-           $username = static::getUrlByUserGuid($params['uguid']);
-           if ($username !== null) {
+           $guid = $params['uguid'];
+           if ($guid !== null) {
                unset($params['uguid']);

                if ($this->defaultRoute == $route) {
                    $route = "";
                }

-               $url = "u/" . urlencode($username) . "/" . $route;
+               $url = "u/" . urlencode($guid) . "/" . $route;
                if (!empty($params) && ($query = http_build_query($params)) !== '') {
                    $url .= '?' . $query;
                }
                return $url;
            }
        }
        return false;
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();
        if (substr($pathInfo, 0, 2) == "u/") {
            $parts = explode('/', $pathInfo, 3);
            if (isset($parts[1])) {
-               $user = User::find()->where(['username' => $parts[1]])->one();
+               $user = User::find()->where(['guid' => $parts[1]])->one();
                if ($user !== null) {
                    if (!isset($parts[2]) || $parts[2] == "") {
                        $parts[2] = $this->defaultRoute;
                    }
                    $params = $request->get();
                    $params['uguid'] = $user->guid;

                    return [$parts[2], $params];
                }
            }
        }
        return false;
    }

-   /**
-    * Gets usernameby given guid
-    * 
-    * @param string $guid
-    * @return string|null the username
-    */
-   public static function getUrlByUserGuid($guid)
-   {
-       if (isset(static::$userUrlMap[$guid])) {
-           return static::$userUrlMap[$guid];
-       }
-
-       $user = User::findOne(['guid' => $guid]);
-       if ($user !== null) {
-           static::$userUrlMap[$user->guid] = $user->username;
-           return static::$userUrlMap[$user->guid];
-       }
-
-       return null;
-   }
-
}

参考

Esfahan
WEB系出身。現在はビッグデータの基盤構築、ETLなどがメイン。 / YouTubeで料理チャンネルやってます → https://www.youtube.com/channel/UCDnYBh2TtUAfQ0Z-tl0jTyw
https://www.youtube.com/channel/UCDnYBh2TtUAfQ0Z-tl0jTyw
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away