質問するログイン新規登録

Q&A

2回答

693閲覧

mod_rewriteでURLのクエリ表記を簡潔にしたい

TTYTT

総合スコア10

mod_rewrite

ApacheウェブサーバーのためのURL書き換えモジュールです。主にプリティーURLに使われていますが、同様に単純置換を超えた、多様なタスクの処理能力や柔軟性があります。

URL

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

PHP

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

0グッド

0クリップ

投稿2024/08/25 08:56

編集NaN/aN/aN aN:aN

0

0

実現したいこと

mod_rewriteを使い、URLのクエリパラメータの表記を簡潔にしたい

例)
https://example.com/hoge?id=123 (hogeはphpファイル) にアクセスした際に、
https://example.com/hoge/123 にリダイレクトさせたい

発生している問題・分からないこと

問題点1
~/hoge/123 にアクセスした際に ~/hoge.php?id=123 の内容を表示させることはできたが、
~/hoge?id=123 にアクセスがあった際に ~/hoge/123 へリダイレクトさせることが上手くできない。

これは実際に ~/hoge/123 というファイルが存在していないために実現不可能ということでしょうか。

問題点2
~/hoge?id=123 にアクセスした時と
~/hoge/123 にアクセスした時で、相対パスの位置が変わってしまう

これはどちらからもアクセスできるようにした場合、PHPで相対パスの出力を制御するものなのでしょうか。

また、リダイレクトによって ~/hoge/123 からのアクセスのみに統一できれば問題は起こらないが、
例えばまたパラメータが増えて ~/hoge/123/ABC というURLにしたくなった場合、
hoge.php内の相対パスを全て変更するという対応方法が正しい方法なのか不思議に思っています。

該当のソースコード

<IfModule mod_rewrite.c> RewriteEngine On #拡張子.phpを省略してもアクセス可能にする RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteCond %{REQUEST_URI} !hoge/([0-9a-zA-Z]*)/?$ RewriteRule ^(.*)$ $1\.php [L] #~/hoge/123 にアクセスした際に ~/hoge.php?id=123 の内容を表示させる RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^hoge/([0-9a-zA-Z]+)/?$ hoge.php?id=$1 [L] #~/hoge?id=123 にアクセスした際に ~/hoge/123 にリダイレクトさせる RewriteCond %{QUERY_STRING} (^|&)id=([^&]+)($|&) RewriteRule .* - [E=X_QUERY_ID:%2] RewriteRule ^hoge$ hoge/%{ENV:X_QUERY_ID} [R=301,L] </IfModule>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

上記のコードの結果は

https://example.com/hoge.php?id=123 アクセス可能だがリダイレクトしない
https://example.com/hoge?id=123 アクセス可能だがリダイレクトしない
https://example.com/hoge/123 アクセス可能だがCSS等の相対パスが無効になる

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

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

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

guest

回答の取得に失敗しました

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問