質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Q&A

解決済

1回答

661閲覧

WordPressにおいてURL末尾の閉じかっこがある場合、自動削除後にリダイレクトが発生してしまう

nikuatsu

総合スコア177

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

0グッド

0クリップ

投稿2022/04/25 14:17

編集2022/04/26 12:35

発生している問題

WordPressで末尾に閉じかっこがあるURLにアクセスすると
https://example.com/氷_(アルバム)

閉じかっこが消えたURLへリダイレクト処理が発生します。
https://example.com/氷_(アルバム

実現したいこと

このリダイレクト処理をなくし、普通に次のURLへのアクセスに留めたいです。
https://example.com/氷_(アルバム)

試したこと1

Wikipediaでは末尾に閉じかっこがあってもアクセスできました。なので自分のサイトの問題だと思います。
https://ja.wikipedia.org/wiki/氷_(アルバム)

試したこと2

リダイレクト処理が発生するというのは、以下を試した上での推測です。

まずfunctions.phpに次のように書いています。

php

1define( 'URL', (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); 2error_log( 'URL = ' . URL );

ここで https://example.com/氷_(アルバム) に1回ブラウザアクセスすると、ログファイルに次の2件が出力されました。

log

1URL = https://example.com/%E6%B0%B7_(%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0) 2URL = https://example.com/%E6%B0%B7_(%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0

しかし閉じかっこがない https://example.com/氷_(アルバム に1回ブラウザアクセスすると、ログファイルに次の1件が出力されました。

log

1URL = https://example.com/%E6%B0%B7_(%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0

なので閉じかっこがある場合にだけリダイレクト処理が発生するのだろうと思いました。

試したこと3

次に自作テーマの利用をやめ、「Twenty Twenty-Two」を利用した上で、末尾に閉じかっこがあるURLにアクセスしてみましたら、やはり閉じかっこが消えたURLがブラウザバーに表示されました。

なので自作テーマの問題でなく、WordPerssの問題ではないかと思っています。

試したこと4

「閉じかっこがある場合に、閉じかっこなしにリダイレクトされる」ならば、無理矢理「閉じかっこがある場合に、閉じかっこありにリダイレクトさせる」よう上書きしてみようと思い、下記を .htaccess に記載しました。

htaccess

1RedirectMatch ^(.*)[)]$ $1)

しかし下図のように「リダイレクトが繰り返し行われました」となってしまいました。

イメージ説明

バージョン

・WordPerssは最新の バージョン 5.9.3 です。
・PHPは 7.4.25 です。

補足

かっこをパーセントエンコードすれば済みますが、試したこと1 のようにWikipediaではエンコードせず出来ているので、自分のサイトでもエンコードせずやってみたいと思っています。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

その問題が生じるのは WordPress が備えている redirect_canonical の機能による URL の正規化が原因です。

functions.php からこの URL の正規化処理を制御することで期待する結果を実現できます。

functions.php から以下のような呼び出しを行ってください。

php

1add_filter('redirect_canonical', 'my_disable_redirect_canonical', 10, 255); 2function my_disable_redirect_canonical($redirect_url, $requested_url) { 3 /** 4 * WordPress は完全一致する slug が存在しない場合に前方一致で slug を類推する機能がある。 5 * 例えば /sample-page/ が存在する場合、/samp/ のようなリクエストがあると /sample-page/ へリダイレクトする。 6 * このリダイレクト処理の過程で、末尾にある一部の記号が取り除かれるなど、リクエストURLの正規化が行われる。 7 * 8 * 完全一致する slug が存在しない場合(404 の場合)に、false を返してリダイレクトを行わないようにすることで、 9 * slug の類推と、URL末尾の記号の除去を防止することができる。 10 */ 11 if (is_404()) return false; 12 return $redirect_url; 13}

is_404()true とならない場合にも URL の正規化を止めたい場合は、上記の関数内に if 文を追加して return false するようにしてください。

投稿2022/04/25 15:44

arcxor

総合スコア2859

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/04/25 16:24

ありがとうございます。またマニアックなところをご存知で…。arcxorさんはWordPerssにまで精通されていらっしゃるのですね。助かりました。 ところで、false を返すとリダイレクトが行われないとのことですが、今回のようなリダイレクト機能は一切不要だと思うので、 if (is_404()) return false; return $redirect_url; でなく return false; だけでもいいのではと思いました。 どういう場合に、404でないときに return $redirect_url; が必要になるのでしょうか?
arcxor

2022/04/25 16:34

典型的には、URL末尾のスラッシュの有無に関して、管理画面のパーマリンクで設定された形式と異なる場合にリダイレクトされるようになっています。 URL の正規化に関してご自身で全て管理されたいのであれば、その関数で常に return false してしまうなり $redirect_url を返さないようにする方針もアリかとは思います。
nikuatsu

2022/04/26 03:35

理解できました。丁寧なご説明をありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問