特定のURLで404エラー!

CakePHPで開発中、ある特定のURLの場合のみ404エラーが発生しました。

一意のURLを生成するためにbase64_encodeなどを駆使して生成したURLで発生。

色々調べてみると…

base64の使用文字
「a-zA-Z0-9+/」
この最後の「/」が問題のようだ。
urlencodeして使用していたけど×

mod_rewriteでURLに「%2F(スラッシュをurlencodeした文字)」が入っていると404を返すらしい。

それを解決するには、「AllowEncodedSlashes On」にすると解決できるそうだ。
これはデフォルトだとOffになっているため、先に%2Fをスラッシュとして認識し、URLが見つからないと404を返すと。。

んじゃ、Onにして解決だね!

と言いたいところだけど、それはちょっと難しい。

これはApacheの設置httpd.confなどで設定するものらしい。
htaccessでは解決できない。
レンタルサーバーなどでは簡単に変更できないので詰んでしまう・・・・

ということで、私は単純にqueryでgetとして送信することで回避させました。

https://zero-one-x.com/xxxx%2Fxxx

↓↓↓↓

サイト

Google Chromeの「このページを翻訳しますか?」と中国語に判定される場合の対処法

ページを作成してChromeで確認すると「このページを翻訳しますか?」と中国語→日本語の案内が出てきました。

サイトは日本語で作成しているけどな・・・なぜ?

色々調べてみると「漢字が多いと中国語と判定されることがある」という情報がありました。

対処するためのタグもありましたので、それを紹介します。

まずはlang属性の追加

<html lang="ja">

次にmetaタグ

<meta http-equiv="content-language" content="ja">

Googleの公式は「lang属性は見てないよ」って発表しているそうですが、
上記に対応でlang=jaの設定をしないと「検出されない言語」という表記で翻訳の画面は表示されました。

それで翻訳の画面を表示させないためには両方の設定が必要なようです。

CakePHP4のデバッグツールバーの表示方法

CakePHP4のデバッグツールバーの表示方法
(CakePHP3も一緒なのかな??)

サーバーにアップしたところ、ツールバーが表示されなくなっていたので、その解決方法

まずはマニュアル通り設定をしていきます。

/config/bootstrap.php

下記のようなdebugの設定があります。

if (Configure::read('debug')) {
	Configure::write('Cache._cake_model_.duration', '+2 minutes');
	Configure::write('Cache._cake_core_.duration', '+2 minutes');
	// disable router cache during development
	Configure::write('Cache._cake_routes_.duration', '+2 seconds');

	/** ここに追加します **/
}

「/** ここに追加します **/」に下記の2行を追加します。

// デバッグツールバーの表示
Configure::write('DebugKit.panels', ['DebugKit.Packages' => true]);
Configure::write('DebugKit.safeTld', ['jp']);# jpドメインの表示を許可する

2行目のDebugKit.safeTldの値にご自身のドメインを指定します。

これでデバッグツールバーが画面の右下に表示されると思いますが、
それでも表示されない場合は強制的に表示させる設定を追加してみます。

Configure::write('DebugKit.forceEnable', true);

私の場合これでも表示されませんでした。
ソースを確認するとデバッグツールのタグを出力されていました。
コンソールを確認してみると下記のエラーメッセージが表示されてました。

toolbar.js?1678925804:54 Mixed Content:
The page at ‘https://xxxxxxxxxx.jp’ was loaded over HTTPS,
but requested an insecure frame ‘http://xxxxxxxxxx.jp/debug-kit/toolbar/xxxxx-xxxxx-xxxxx’.
This request has been blocked; the content must be served over HTTPS.

SSLじゃないのでブロックしたと。

この情報をもとに検索
下記の修正案がありました。

参考
https://github.com/cakephp/debug_kit/issues/736

上記の記事を参考に修正していきます。

vendor/cakephp/debug_kit/src/ToolbarService.php

public function injectScripts($row, ResponseInterface $response)
{
...
        $url = Router::url('/', true);
+        if (isset($_SERVER['HTTPS']) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
+            $url = str_replace('http', 'https', $url);
+        }

※「+」が追加する行

vendor/cakephp/debug_kit/templates/Requests/view.php

<?php $this->Html->script('DebugKit./js/debug_kit', [
    'block' => true,
    'id' => '__debug_kit_app',
    'data-id' => $toolbar->id,
-    'data-url' => Router::url('/', true),
+    'data-url' => checkHttps(Router::url('/', true)),
    'data-webroot' => $this->request->getAttribute("webroot"),
]) ?>
+<?php
+function checkHttps($url) {
+    if (isset($_SERVER['HTTPS']) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
+        $url = str_replace('http', 'https', $url);
+    }
+    return $url;
+}
?>

※「+」が追加する行 「-」は削除する行

これで自ドメインがSSLならSSLでデバッグツールのURLを発行してくれます。