【PHP】クエリパラメータ形式のURLを/post/任意の文字列に変更する方法

例えば、当ブログのurlは記事ファイル+記事のidで表示されています。

hiroshilog.com/single.php?id=dewr0fqy17e

「hiroshilog.com/single.php?id=dewr0fqy17e」これでも良いのですが、いかんせんurlが長く分かりずらい。seoに興味を持たない私ですが、内部的な対策やurlの正規化などはしっかりやっていきたい。

表示としては「hiroshilog.com/post/任意のurl」で表示できるようにしたい。

そもそも「?」以降の記述はなんなのか?

?以降の記述はクエリ情報といいクライアント側からサーバーへ情報を渡すための方法です。

と言っても何のこっちゃ分からないですね。「データを取得し特定の制御を行うための媒体」と考えるのが良さそうです。

例えば絞り込み検索など特定のカテゴリーやタグに紐づけられたページを表示する場合など、またページネーションで該当する数字に紐づいたページを表示するなど特定の条件下でページを選定したい場合などにこのクエリ情報を扱います。

総じてこのクエリ情報のことをクエリパラメータと呼ぶそうです。

読みやすいURLにしたい

今までwordpressを使ってwebサイトを構築していたのですが、wordpressでは自動でurlを整形してくれる処理が施されているようです。

よく見る「https://ドメイン名/フォルダ/〇〇.html」はパスパラメータと呼び、該当のファイルまでの階層を表したもので、

seo的には階層構造がわかり易く伝わりインデックスにも影響がある。

被リンクのことを考えるとurlで何となくどんな記事なのか予測が立てられる方が安全で親しみやすいと言えるかと思います。

架空のフォルダを作成する。

私の場合は「hiroshilog.com/post/任意のurl」にしたいのでhrefのsingle.phpをpostに変更します。

このままでは実在しないフォルダなので当然何も表示されません。そこで、.htaccessで「hiroshilog.com/post/〇〇」にアクセスすると「hiroshilog.com/single.php?id=〇〇」に変換する処理を加えます。こうすることで表向きは実在しないフォルダであっても裏側では「/single.php?id=〇〇」として処理され表示として「hiroshilog.com/post/任意のurl」になります。

RewriteEngine On
RewriteRule ^post/([^/]+)/?$ single.php?id=$1 [L,QSA]

この記述を.htaccessに記述します。既にRewriteEngine Onが定義されている場合はその下に書きます。

内容としては、RewriteEngine Onは「これからURLの変更を定義する」という宣言のようなものです。

「post/」で始まるurlを「single.php?id=」に変換するというのが全体像です。

相対パスだとエラーになる

/post/配下でパス指定が相対パスだと例えばトップページに戻る際「/post/index.php」になり表示エラーになるので、ルート相対パスで指定するようにしましょう。

microcmsの取得に失敗しました。HTTPステータス:400
microcmsの取得に失敗しました。HTTPステータス:400

このように相対パスだと/post/の中でindex.phpを探すのでエラーになります。

vscode
相対パスをルート相対に直す。

これは全てのファイルで同様にルートに直さないといけません。cssファイル、jsファイルもルート相対で指定します。

表示を確認

/post/urlに変更できた

うまくurlが変更できました。私はMicrocmsを利用しておりコンテンツIDをそのままurlとして利用しています。

既に投稿している記事のurlは自動で割り当てられたランダムな文字列になっていますが、任意のものに変更可能です。

参考にしたサイト

office-obata.com

https://zenn.dev/

カテゴリー一覧

PAGE TOP