にしし ふぁくとりー:西村文宏 個人サイト

Presented by Nishishi via Movable Type. Last Updated: 2023/06/02. 12:58:24.

Sakura Scope (2020年11月)

ちょっと倒錯気味な、ただの日記です。(^^;)
これはやばいと思われた場合は、お早めに閲覧を中止されることをお勧め致します。

Windows10で「設定」→「システム」を開くとウインドウが一瞬で落ちる現象の解決記録

購入したばかりの新PCなのに「設定」→「システム」を開こうとすると再現率100%で落ちる

Windows10でディスプレイの解像度を調整したかったので、デスクトップを右クリックして表示されるメニューから「ディスプレイ設定」を選択したのですが、設定ウインドウが一瞬だけ開くように見えるものの、0.2秒後くらいに落ちて消えてしまいます。何度操作しても同じように落ちます。

いろいろ操作を試してみると、Windows10のスタートメニューから「設定」を開いて、設定一覧から「システム」をクリックすると「設定」ウインドウそのものが落ちることが分かりました。
何度操作しても落ちます。Windows10を再起動してから試しても落ちますし、管理者権限を付与した別ユーザを新規に作成してから試しても落ちますし、Windows10をセーフモードで起動してから同じ操作をしても落ちましたし、Windows Updateをすべて適用してもやはり落ちました。
なかなかしぶとい現象です。(^_^;;;

……これ、購入したばかりの新PCなんですが。(笑)
購入して最初に電源を投入したら、接続してあるディスプレイの解像度がおかしい(本当は1920×1200なのに、Windows側は1920×1080で表示している)ので、まずは最初にその解像度を修正しよう、と思って操作したら、上述の問題に直面したのです。
あまり詳しくない人だったら、PCメーカー側の問題ではないかと思ってしまいそうな気がします。

PCを最初にセットアップする際(=Windows10のセットアップ時)にはWindows Updateが実行されますから、おそらくそのアップデートによって発生した不具合なのでしょう。
いろいろ検索してみると、この「設定画面が落ちる」という現象は「Windows10のアップデート直後に発生することが多い不具合」みたいな感じで報告されていましたから。

最悪の場合でもWindows10を再インストールすれば解決するでしょうが、そうする必要はなく解決はできました。(そこそこの試行錯誤と時間が掛かってしまいましたが。)
以下はその解決に至るまでの記録です。

※結論を先に述べておくと、1度目のsfc /scannowコマンドでは修復に失敗しましたが、紆余曲折を経た2度目のsfc /scannowで修復できて解決しました。

---【目次】---

イベントビューアで確認すると SystemSettings.exe がクラッシュしていた

Windowsでは、トラブルが発生した際のログを「イベントビューア」という付属機能で閲覧できます。(Windows10なら、[Windowsキー]+[X]でメニューを出してから[V]キーを押すと起動できます。)

そのイベントビューアを見ると、C:\Windows\ImmersiveControlPanel\SystemSettings.exeというプログラムがクラッシュしたと報告されていました。下図の黄色矢印部分に見える「障害が発生しているアプリケーションパス」欄に表示されています。
試しに「設定」→「システム」を開く操作をしてから[F5]キーでイベントビューアを更新すると、全く同じApplication Errorログが追加で記録されていました。

イベントビューアで確認すると、SystemSettings.exeがクラッシュしていた。

というわけで、この SystemSettings.exe が正しく起動するようになれば解決するようです。
問題は、その方法が分からないことですが。(^_^;)

Windows10の「設定」関連プログラムがクラッシュする現象をググってみるといろいろ見つかった

いろいろググってみたところ、この「設定」→「システム」画面に限らず、Windows10の「設定」に含まれる何かが突然100%の再現率で落ちるようになる現象は、ちらほら存在するようです。
中には最初の「設定」ウインドウすら開けずに落ちてしまうケースもあるようで、もしそうだったらなかなか厳しいですね。

情報を探してみた中で、私が参考にしたサイトは、以下の通りです。
どれも対処方法を詳しく解説しているページでした。

昔々にこの問題が発生し始めた頃には、Microsoftの中の人が臨時に公開したトラブルシューティングツールを使うことで修復できたらしいですが、今は公開されていないので使えません。(それを使ったら解決したという記事もいくつか目撃しました。もっとも、それは数年前のバージョンのWindows10の話ですから、いま使えたとしても機能しないかも知れません。そもそもこの手の情報はできるだけ新しいものを探す方が無難で望ましいでしょう。)

Windows10の「設定」ウインドウが落ちる問題の解決策として紹介されている方法を片っ端から試してみた

まず、DELLのサポートがおすすめしていた方法を試しました。
私のPCはDELL製ではありませんが。^^;
PCメーカーが公開している情報なら、先に試してみる価値は高いかなと思いまして。(PCメーカーはコスト面からできるだけ人力サポートを避けたいので、ユーザが自力で解決してくれるよう有用な情報をネットに上げているだろうと。^^;)

▼Windows10のシステムファイルをチェックして修復するコマンド「sfc /scannow」を実行する

Windows10には、システムファイルをチェックして修復するコマンド「sfc(System File Checker)」が用意されています。
管理者権限でコマンド プロンプト(またはWindows PowerShell)を開いて、sfc /scannowと打って実行するだけです。/snannowはパラメータなので、sfcの直後には半角の空白文字が必要です。

それを実行してみた結果が下図です。(Windows PowerShell上で実行した画面)

Windowsリソース保護により、破損したファイルが見つかりましたが、それらの一部は修復できませんでした。

所要時間は10分くらいだった気がします。
結果の表示には……、

Windowsリソース保護により、破損したファイルが見つかりましたが、それらの一部は修復できませんでした

破損ファイルはあったが修復はできなかったという報告でした……。
不具合の存在を発見してくれただけマシではありますが、修復できないのでは困ったままです。
「修復できない」と言いつつ、実は問題は解決していたりしないかな……という淡い期待の元、再度「設定」→「システム」を実行してみましたが、やはり一瞬でウインドウが落ちました。(^_^;)

このsfcコマンドは、システムファイルに何らかの破損があった場合に、システムファイルのバックアップフォルダにある中身を使って復元してくれる仕組みのようでした。
詳しい情報はメモしなかったので忘れてしまいましたが、このコマンドが参照する先のフォルダが、私のPCには存在しない(ように見えた)点がやや気になりました。
OEM製のPCだからそのフォルダがないのか、それとも今のバージョン(Ver.2004)のWindows10には元々そのフォルダは存在しないのか、そこまではハッキリ調べませんでしたが。(もしそのフォルダがないのが原因なら、別のWindows10 PCからコピーしてくるという手もあったなと、後々になってから思い至りました。^^;)

▼Windows10のトラブルシューティングツールを実行する

次にDELLがお勧めしていたのは、Windows側が標準で用意しているトラブルシューティングツールを試す方法です。(一番期待できなさそうだと思いましたが、まあ藁にもすがる思いで試してみました。)
「設定」→「更新とセキュリティ」→「トラブルシューティング」とたどると起動できます。

しかし……!

「推奨トラブルシューティング」欄には「現時点で推奨事項はありません」と出るだけで、何のトラブルシューティングツールも実行させてはくれませんでした。(予想はしていましたけども。)
とはいえ、その下にずらーっと各種トラブルシューティングツールが並んでいますので、手動で選択して実行することはできます。実際にいくつかやってみましたが「問題ない」という結果しか出てきませんでした。……役に立たねえ!

※これは、そもそも「設定」ウインドウすら一瞬で落ちてしまって開かない人には使えない(使いにくい)方法でしょうね。トラブルシューティングツール1つ1つをピンポイントに特定して実行する方法があればいけるかも知れませんが。(そういう方法はありそうでしたが、私の件では関係ないので詳しくは調べていません。)

▼Get-AppXPackageで「設定」アプリを再構築する

DELLがさらにお勧めしていた方法は、コマンドプロンプト(またはWindows PowerShell)でGet-AppXPackageというコマンドを実行して、「設定」アプリだけを再インストールする方法です。
しかし、DELL側が指定したコマンドをそのままコピー&ペーストしてWindows PowerShellから実行してみましたが、コマンドが正しくないという意味のエラーがずらーっと出てくるだけで何も実行できませんでした。
これは、このDELLのサポートが想定しているバージョンと、私のWindows10のバージョンが異なるからかもしれません。

▼別の管理者ユーザを作成して、そちらから試す

DELLが最後にお勧めしていたのは、別のユーザアカウントを作成して、そちら経由でログインし直してから「設定」ウインドウを開く、という方法です。ユーザプロファイルが破損していることが不具合の原因かもしれないから、とのこと。

というわけで、Windows10のローカルアカウントで、管理者権限を付与した新ユーザを作ってみました。
今のWindows10は、とにかくMicrosoftアカウントを使ってログオンさせようとしてくるので、(Microsoftアカウントとは関係のない)ローカルアカウントを作成する操作が結構面倒ですね……。

一旦、Microsoftアカウントを指定する画面まで行ってから、「Microsoftアカウントを持たないユーザを追加する」という項目を選択する必要があります。
具体的には、[設定]→[アカウント]→[家族とその他のユーザー]→[その他のユーザーをこのPCに追加]→[このユーザーのサインイン情報がありません]→[Microsoftアカウントを持たないユーザーを追加する]です。

で、試しに別のローカルアカウントを作成してからそのユーザでログオンし直して試しましたが、やはり「設定」→「システム」ウインドウは一瞬で落ちました。orz
ユーザプロファイルは関係なかったようです。

▼BITSトラブルシューティングツールを実行する

次に参考にしたウェブサイト(先のリストⒷ)では、WindowsのUIに不具合が発生している場合には、BITS(バックグラウンドインテリジェント転送サービス)に問題がある可能性があるので、Microsoftが提供している「BITSトラブルシューティングツール」というのを実行してみると良いと解説されていましたので試しました。

それを実行した結果が下図です。

Background Intelligent Transfer Serviceトラブルシューティング:Service registration is missing of corrupt

表示されている結果は、

見つかった問題の一部をトラブルシューティングで自動的に修正できませんでした。
見つかった問題
Service registration is missing of corrupt 未解決 ×

という、ここでもまた「問題があることは分かったが、修復はできなかった」という報告でした……。orz
なかなか先へ進んでくれません。(^_^;;;

▼Windows10を再インストールするしかないのではないか、と若干思い始めた

さて、ここまで来ると、万策尽きたのではないか……? という気がしてきました。
だいたいネット上でいろいろ検索しても、「ここまでやってもダメならWindows10を再インストールしましょう」的なことが書かれています。

私の場合、このPCは購入してセットアップを開始したばかりの新PCなので、個人設定も個人ファイルもまだなにもない状態ですから、1から再インストールしても大きく面倒なことはないのですけども。ただ、プリインストールのMicrosoft Officeを再ダウンロードする必要があったり(今のMicrosoft OfficeはインストールDVDメディアの提供がないので)、どうせ次のセットアップ時にもWindows Updateが走る(ことで同じ問題が発生するかもしれない)ことを考えると、なんとかこのままWindows10自体の再インストールは避けて解決する方法を探したいとも思っていました。

Windows10の大型アップデートの適用に期待

さて、最近のWindows10は、年2回のペースで大型アップデートが提供されています。
この大型アップデートは、ほぼOS丸ごとを差し替えるようなものですから、Windows10をクリーンインストールするに匹敵する更新効果を期待しても良さそうな気もしました。

というか、この『「設定」ウインドウが落ちるようになる』という不具合こそが、そういうアップデートが原因で発生しがちなようなのですが。
アップデートの過程で偶然発生するようになった問題なら、再度アップデートしたら(本来の動作通りにアップデートされたら)解消したりしないかなと。(^_^;)

▼Windows10 Ver.2004 を Ver.20H2 にバージョンアップした

私が購入したこのPCでは、Windows10のVer.2004が稼働していました。(※2020年4月リリースの版)
しかし、つい先月に最新のWindows10 Ver.20H2がリリースされています。(※10月リリース)
ネット上の記事をいろいろ見ると、このWindows10 Ver.20H2では、新機能の1つとして「ディスプレイのリフレッシュレートの設定変更が簡単になる」という点が挙げられていました。

私が今回に遭遇した問題(開けずに落ちる問題)である「設定」→「システム」ウインドウは、まさにそのディスプレイ関連の設定項目を含んでいる領域です。
とすると、Windows10 Ver.20H2を適用すれば、そのプログラム(SystemSettings.exe)も更新されるハズではないか、と思いまして、期待が高まりました。

というわけで、早速Windows UpdateからVer.20H2をインストールしました。
Ver.2004からVer.20H2へのバージョンアップは、ほんの10分くらいで済んだように思います。

▼しかし、落ちる!

しかーし!

無事にWindows10 Ver.20H2にバージョンアップはできたものの、スタートメニューから「設定」を起動して「システム」メニューをクリックすると、設定ウインドウが一瞬で消滅します。
ウインドウが落ちる現象に変わりはありませんでした。orz
くぉら、Microsoft!ヽ(`Д´;)ノ

これはもう、翌朝にじっくりリカバリーDVDからWindows10をインストールし直すしかないのか……と思ったのですが……。

▼最後にもう一度「sfc /scannow」を実行してみた

最初にsfc /scannowを実行した際には、「問題は見つかったが修復できなかった」という報告がなされたわけですが、
OSのバージョンを上げたことで、修復に必要なデータが更新されていたりしないだろうか? という淡い期待の元で、再度sfc /scannowコマンドを実行してみました。

その結果が下図です。

Windowsリソース保護により、破損したファイルが見つかりましたが、それらは正常に修復されました

なんと、

Windowsリソース保護により、破損したファイルが見つかりましたが、それらは正常に修復されました

正常に修復されました!
正常に修復されました!
正常に修復されました!

ついに、欲しかった報告を目にしました。
一応念のためにWindows10を再起動してから、「設定」ウインドウを出してメニュー項目「システム」をクリックしてみると……、

Windows10「設定」→「システム」→「ディスプレイ」の表示

見えた~~~ッ! *・゜゚・*:.。..。.:*・'(*゚▽゚*)'・*:.。. .。.:*・゜゚・*

ちゃんと見えました。
落ちることなくウインドウが表示されています。(上図は既にマルチディスプレイのセットアップを済ませた後の画面ですが。)

落ちることなく「設定」→「システム」ウインドウが開けるようになった

というわけで、落ちずに「設定」→「システム」ウインドウが開けるようになりました。
Windows10の修復機能が(アップデートによって更新されたためか)ちゃんと機能してくれたようです。
おかげで、Windows10をイチからインストールし直す手間は回避できました。

結論としては、やはりコマンドプロンプト(またはWindows PowerShell)でコマンドsfc /scannowを実行するのが解決策なのですね。
問題は、それが失敗する場合で。
もし、Windows10の新しいバージョン(大型アップデート)が提供されているようなら、そのアップデートを適用してから再度コマンドsfc /scannowを実行すれば、望みがあるのかも知れません。

というわけで、解決できた記録でした。

Windows10でコマンドプロンプトをほぼ一瞬で起動するショートカットキー

Windows10ではキー3つの押下だけでコマンドプロンプトを起動できるショートカットがある

Windows10の場合は、事前設定不要でコマンドプロンプトを(ほぼ)一瞬で起動できるショートカットキーがあります。
「名前を指定して実行」機能などを経由する必要はありません。
しかも、管理者権限下でのコマンドプロンプトを起動することもできます。

結論から言うと、以下のショートカットキーで起動できます。

  • 通常のコマンドプロンプトを起動するショートカットキー: [Windowsキー]+[X] の後に [C]キーを押す。(※)
  • 管理者コマンドプロンプトを起動するショートカットキー: [Windowsキー]+[X] の後に [A]キーを押す。

※コマンドプロンプトの代わりにWindows PowerShellを表示する設定になっている場合は、[C]ではなく[I]キーを押す必要があります。(管理者権限付与版の方のキーは同じ。)

なぜこのショートカットキーで起動できるのかを下記で説明しておきます。(コマンドプロンプト以外にも、デバイスマネージャとか、電源オプションとか、ディスクの管理とか、Windowsのシステム系の機能に簡単にアクセスできて便利です。)

目次:

Windows10では[Windowsキー]+[X]でシステム系機能のサブメニューが出てくる

最近のPCのキーボードにはWindowsキーというキーがあります。
Windows10では、この[Windows]キーを使ったショートカットがいろいろ定義されています。例えば[Windowsキー]+[A]で通知を出すとか、[Windowsキー]+[E]でエクスプローラを起動するとかです。

同様に、Windows10では[Windowsキー]+[X]を押すと、下図のような小さなメニューが出てきます。(スタートボタンを右クリックしても出てきます。)
この真ん中ら辺には「コマンドプロンプト」もリストアップされていることが分かるでしょう。(図の黄色矢印の先)

コマンドプロンプトの起動メニュー項目もあるWindows10のサブメニュー コマンドプロンプトがない場合は代わりにWindows PowerShellがあるのでそれを使えば良い

※コマンドプロンプトの代わりにWindows PowerShellを表示する設定になっている場合は、上図右側の緑色矢印で示したように、「コマンドプロンプト」の2項目は存在せず、代わりに「Windows PowerShell」の2項目が表示されます。その場合は、(管理者権限なしの場合に)押すキーが[C]から[I]に変わりますが操作方法は同じです。なお、このメニュー内に「コマンドプロンプト」を表示するか「Windows PowerShell」を表示するかは、「スタート」→「設定」→「個人用設定」→「タスクバー」にある『コマンドプロンプトをWindows PowerShellに置き換える』ボタンで選択できます(最近の新しいバージョンのWindows10なら)。望みに応じて事前に切り替えておくと便利です。

▼このメニュー内の項目は、英字キーで選択できる

このメニューに限った話ではありませんが、Windowsではたいていのメニュー項目を英数字キーで選択できます。
このメニューでは、

  • コマンドプロンプト(C)
  • コマンドプロンプト(管理者)(A)

このように表示されていますので、
このメニューが表示されている状態で、

  • [C]キーを押せば、通常のコマンドプロンプトが起動しますし、
  • [A]キーを押せば、管理者権限でのコマンドプロンプトが起動します。

なので、このメニューを出す[Windowsキー]+[X]と合わせて、合計3つのキーを押下するだけでコマンドプロンプトを起動できるわけです。

※言うまでもありませんが、他にもこのメニュー内にある機能はすべてキー3つで起動できます。ただし、タスクマネージャはこれよりも [Ctrl]+[Shift]+[ESC]を押す方が早いと思いますが。(ボタン3つの同時押しで済みますから。)

例:Windows10のバージョン番号を知りたい場合

バージョン情報を見たいときは、[Windowsキー]+[X]→[C]キーでコマンドプロンプトを起動した後、verコマンドではなくwinverコマンドを打ちます。(verコマンドだとビルド番号は出てくるものの、バージョン番号が出てきません。winverコマンドだと下図のようなウインドウが開くのでバージョン番号も分かります。)

コマンドプロンプトからwinverコマンドを打つとバージョン情報ウインドウが開く

バージョン番号は、Windowsのスタートメニューから「設定」→「システム」→「バージョン情報」をたどっても表示されますけども、上記のようにコマンドプロンプトからコマンドを打った方が早そうな気がします。

例:Windows10をキー操作だけでシャットダウンしたい場合

このメニューにはシャットダウンや再起動の項目もありますから、キー操作だけでシャットダウンや再起動をしたい場合にも使えます。

  • Windows10をキー操作だけでシャットダウンしたい場合は、[Windowsキー]+[X] の後に [U]キーを2回押せば良いです。
  • 再起動したい場合は、[Windowsキー]+[X] の後に [U]→[R] の順で押せば良いです。

キー操作だけでシャットダウンや再起動をしたい場合にも使える

以上、コマンドプロンプトをキー3つで起動できるショートカットキーがある、という話でした。(関係ない話もしましたけども。)

レンタカー費用等補償特約と車両新価保険特約は自動車保険から外した

自動車保険の特約を見直した

自動車の名義を引き継いだときに自動車保険(民間保険)もそのまま引き継いだのですが、改めて契約内容を見てみると、ちょっと気になる特約がありました。契約更新に合わせて特約の内容を詳しく調べて見直してみたところ、1万円くらい保険料が下がりました。
今まで毎年1万円くらい無駄に払っていたのですね……。(今までは私が契約主ではなかったので、詳しい条件は見ていなかったのでした。)

まず、外した特約は、

  • レンタカー費用等補償特約 (=事故や故障時にレンタカーを借りる費用を30日間補償してくれる特約)
  • 車両新価保険特約 (=車が大破したときに新車を購入する費用を補償してくれる特約)

の2つで、加えた特約は、

  • レンタカー費用等不担保特約 (=レンタカーを借りる費用を一切補償しないようにする特約)

です。

外した2つの特約にはもちろん役割があるのですけども、私の場合には明らかに不要だと判断できました。
その理由を以下に書いてみます。

1. 事故後にレンタカーを借りてまで車を運転したくはない

日常生活で1日たりとも自動車が使えなければ困る、という状況で生活している場合にはもしかしたら加えておく方が良いかもしれない特約でしょうかね。(たとえそうでも、保険料を上げてまでレンタカー費用を補償してもらう必要性があるかどうかは疑問ですが。)

私の場合、数日間くらい自動車が使えなくても困ることはありません。移動手段は他にもありますし。
何より、事故に遭った直後に、乗り慣れていない別の車を運転する気になど、まずなりません。
なので、たとえレンタカーを無料で用意されたとしても使わないでしょう。

というわけで、レンタカーを借りる費用を補償してもらう必要性がまったくありません。単純に保険料の無駄です。

▼標準で15日間のレンタカー補償が付いているので、それを0日にするには別の特約が必要

私が契約している自動車保険では、元々標準で「15日間のレンタカー補償」が付いています。
先の「レンタカー費用等補償特約」というのは、その保証期間を30日間に拡張するための特約です。
……完全に不要です。
そもそも、15日では修理できず30日間も修理に日数が掛かってしまうほどの大事故ってそんなにあるんでしょうか。(^_^;;;

で、そんな標準で付帯されている「15日間のレンタカー補償」すらも削除するための特約が「レンタカー費用等不担保特約」です。
これを加えておくと、レンタカーの補償は0日になります。つまり、レンタカー補償を完全に削除できます。

2. 車が大破するような事故の後にさらに新車を買うとは思いにくい

自動車が事故で破損した場合などには、修理費を保険から賄うことができます。
ただ、保険で賄える修理費を超えるくらいまで大破した場合には、修理費の残りは自腹になります。まあ、当たり前ですが。

そんなときに、(50%以上壊れていて、かつエンジンも故障している場合、とか何か細かな条件があったと思いますが)新車に買い換える費用を負担してくれる特約が「車両新価保険特約」です。
この特約があると、その車を購入したときの額を基準にして設定される額を上限に、新車の購入費用を保険で賄えます。

が。

車がそこまで大破するような事故の後にまた新車を購入するようなメンタルは持ち合わせていません。(笑)

事故以外にも故障とか災害とかで大破する可能性があるのではないかと思われるかもしれませんが、事故以外の理由による大破はそもそもこの特約の対象外です。(地震や津波とか故障による損害とか自然な消耗とかが原因の場合は対象外だと記載されていました。)

なので、やはりこの特約も不要です。

1万円くらい下がった

レンタカー補償を削除して、車両新価保険特約も削除することで、年間の自動車保険料はだいたい1万円くらい下がりました。(つまり、今までは毎年1万円くらい余分に支払っていたということです。私が払っていたわけではありませんけども。)

保険の場合、選び方の基準は「あったら嬉しい」とかではなく、「なかったら困る」だと思います。
そもそも、「とても払えないような莫大な金額が必要になったとき」のために入っておくのが「保険」なのですから。(だから、人身事故や物損事故などのように、場合によっては数千万円とか億単位の金額が必要になる可能性に備えて(上限額のない)民間の自動車保険の契約が必須です。法律で義務づけられている自賠責保険には上限額があるため、そこまでの高額はカバーできませんから。)

しかし、レンタカーを借りる費用だとか、本来の目的地まで別の交通手段を使って移動する際の費用だとかは、そもそも「払えない額ではない」でしょう。
そういう「払ってもそこまで困るわけではない」程度の費用は、保険を掛けておく必要性がありません。

ただ、自動車保険の場合、「事故の直後」に利用することになるケースが多いでしょうから、冷静に対処できるかどうか事前には予想できません。
なので、たとえ金額的には問題なくても、「とても自力では手配できそうにないもの」を特約としてプラスしておくのは良いとは思います。
ロードサービスとか、(こちらの責任がゼロで)保険会社が示談交渉してくれないときに弁護士を使うための特約とか。保険会社にさえ連絡すれば、あとはすべてそこから手配してもらえるような体制になっていれば安心できるでしょう。
その安心を手に入れるのも保険の役割と言えるでしょうね。
(そこを自力で手配できる余裕を確信できるなら、保険でカバーする必要性はないでしょう。)

URLの末尾に余分な記号 ) や " 等があっても正しいページにリダイレクトする.htaccessの書き方

URLの末尾に不要な記号が付加された状態でリンクされていても Not Foundにせず意図通りのページを表示させたい

CMSツールが普及したためか何なのかよくは分かりませんけども、URLの末尾に余計なカッコ「 ) 」や引用符「 " 」が付いた状態でリンクされていることが原因で、Not Foundエラーがなっていることが時々あります。

  • 本来なら https://www.example.com/ にリンクしないといけないところを、
  • なぜか https://www.example.com/)https://www.example.com/" などにリンクしてしまっている

……というようなケースです。
書いた本人がリンクを確認していればすぐに分かることですが。

リンクされる側がそれを(=リンク元の記述を)どうにかすることはできないわけですけども、URLの末尾に余計な記号が付加されていても正しくページを閲覧できるようにする方法はあります。
URLの末尾に余計な「 ) 」や「 " 」などの記号があっても、その記号を除外したURLにリダイレクトすれば良いだけです。

【目次:】

URLの末尾に不要な記号があっても無視して(記号なしURLにリダイレクトして)正しいページを表示させる.htaccessソース

方法はとても簡単で、.htaccessファイルを用意して以下の1行を書くだけです。

RedirectMatch ^(.*/)[)"']$ $1

これで「/」記号で終わるURLの後に存在する閉じ丸カッコ「 ) 」と引用符「 " 」と「 ' 」が除外されます。
その結果、「 https://example.com/) 」や「 https://example.com/" 」のようなURLでリンクされていても問題なく表示できるようになります。

それ以外の記号を対象にしたい場合は、角括弧の内側に列挙すれば良いだけです。
角括弧そのものを含みたい場合や、正規表現で特別な扱いがなされる記号を含めたい場合は \ 記号を使ってエスケープする必要があります。
例えば、閉じ角括弧 ] やドット記号 . も除外対象に含めたいなら、[)"'\]\.]のように書けば良いでしょう。
(※特にドット記号「 . 」をそのまま書いてしまうと、「任意の1文字」にマッチしてしまうので、最後の「/」以降のあらゆる文字を除外してしまって困ったことになると思います。)

終わりが「/」ではないURLでも、末尾の余分な記号を無視する.htaccessソース

ただ、先程の.htaccessソースだと「 https://example.com/index.html) 」のようにに、「/」で終わっていないURLの末尾に余計な記号がある場合には使えません。

何でもかんでもURLの末尾に存在する記号を無条件で削除してしまうと、本当にその記号がURLの末尾に存在するような状況で不都合が起きますから、「/」で終わるURLの場合だけに限定しておく方が良いかな、と思ったのでそうしておきました。(そのような状況があるかどうかよく分かりませんけども、CGIに渡すパラメータとしてなど、可能性としてないとは言えない気がします。hoge.cgi?key="sakura"みたいな感じで……。あまりURL内で引用符を使うケースはなさそうな気もしないでもありませんが。)

しかし、URLの末尾に存在するあらゆる余分な記号を排除したい場合には、以下のように書けば済みます。(単に先程の正規表現の中から「/」を削除しただけです。)

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

これで、あらゆるURLの末尾に存在する閉じ丸カッコ「 ) 」と引用符「 " 」や「 ' 」が除外されます。
その結果、「 https://example.com/sample.shtml) 」や「 https://example.com/sample.shtml" 」みたいなURLでリンクされていても問題なく表示できるようになります。

▼もうちょっと何か限定したい

よほどページ数が限られていて全URLを自分で認識できている場合は良いと思うのですが、そうでない場合には「あらゆるURL」を対象にするとちょっと不安もあります。

▽除外1

.html や .shtml のように「動的に生成されるページではなさそうなURLの末尾」だけに限定して余計な記号がある場合を判定すれば良さそうな気もします。
下記の記述だと、URLの末尾が .html か .htm か .shtml の場合だけに限定した上で、URL末尾の「 ) 」や「 " 」や「 ' 」を除外します。

RedirectMatch ^(.*\.s?html?)[)"']$ $1
▽除外2

もしくは、「URLが『?』記号以外で構成されている際のURLの末尾」に限定すれば良いかもしれません。URLにクエリ文字列を付加する場合は「?」記号が使われますから。(URLの構造を自力で変換していない限りは。)
その場合は、以下のような記述になるでしょうかね。
正規表現[^\?]で「?記号以外の文字」になりますから、「URLの中に?記号が含まれていない場合」だけを対象にできます。

RedirectMatch ^([^\?]*)[)"']$ $1
▽除外1+2

上記の2つを合体させて、
URLの末尾が .html か .htm か .shtml の場合だけに限定した上で、URLの構成文字中に「?」記号が含まれていない場合だけを対象にするなら、以下のような記述でしょうかね。

RedirectMatch ^([^\?]*\.s?html?)[)"']$ $1

これと、冒頭の『URLが「/」記号で終わる場合』とを合体させると良い感じになりそうな気がしました。

URL内に「?」記号が含まれておらず、URLが「/」か「.htm .html .shtml」のいずれかで終わる場合に、末尾の余分な記号を無視するようリダイレクトする.htaccessソース

というわけで、以下のような.htaccessソースでどうでしょうか。

RedirectMatch ^([^\?]*(/|\.s?html?))[)"']$ $1

これだと、以下の条件を満たす際にだけ、

  • URL内に「?」記号が1つも含まれていない場合で、 ([^\?]*
    • URLが「/」記号で終わっているか、 (/
    • または (|
    • URLが「.htm」または「.html」または「.shtml」で終わっているとき (\.s?html?

URL末尾に余分な記号「 ) 」または「 " 」または「 ' 」があれば、それらを除外したURLにリダイレクトされます。

今回の動機は「他サイトからリンクされる際に、URLの末尾に余計なカッコや引用符が付いた状態でリンクされてしまっている場合にNot Foundになるのを避けたい」というだけですから、上記の対処で十分な気がします。

RedirectMatchとだけ書くとHTTPステータスコード302でリダイレクトされるので、問題なくリダイレクトされると確認できたらRedirectMatch permanentと書き直して301でリダイレクトさせた方が良いかもしれません。

なお、正規表現のリファレンスは、正規表現辞典 改訂新版 (DESKTOP REFERENCE)がお勧めです。

2020年11月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

他の月

--- 当サイト内を検索 ---