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

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

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

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Q&A

解決済

1回答

1750閲覧

.htaccessで動的URLを静的URLに置き換えるときパラメータがあると表示されない。

helloman

総合スコア39

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

0グッド

1クリップ

投稿2018/12/19 11:23

.htaccessで動的URLを静的URLに置き換えているのですが、
URLにパラメータをつけてブラウザにアクセスすると何も表示されなくなります。

実行している.htaccess

RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)$ index.php?p=$1&%{QUERY_STRING} [L]

パラメータがある場合は&でつなげるようにしているのですが、
下記をに書き換えて実行すると&でちゃんとリダイレクトされます。

RewriteRule (.*)$ index.php?p=$1&%{QUERY_STRING} [R=301,L]

【元のURL】http://hoge.com/test/?hello=goodbye
【書き換えのURL】http://hoge.com/?p=test/&hello=goodbye

パラメータの中にスラッシュがあるのでディレクトリとして認識されているのかなと思っているのですが、
それを回避する方法がわかりません。

全体的にはこんな感じで設定しています。

<IfModule mod_rewrite.c> RewriteEngine on RewriteBase /hubhb # index系のファイル名を削除 RewriteCond %{THE_REQUEST} ^.*/index.(html|htm|php) RewriteRule ^(.*)index.(html|htm|php)$ $1 [R=301,L] # パスの最後にスラッシュを追加 RewriteCond %{REQUEST_URI} !/$ RewriteCond %{REQUEST_URI} !.[^/.]+$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* %{REQUEST_URI}/ [R,L] # ファイルパスの書き換え RewriteCond %{REQUEST_URI} !^/hubhb/_projects RewriteRule ^(.+?)/(.*)/(.*).(.*)$ _projects/$1/html/$2/$3.$4 [L] # 動的URLに書き換え RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*)$ index.php?p=$1&%{QUERY_STRING} [L] </IfModule>

よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

URLにパラメータをつけてブラウザにアクセスすると何も表示されなくなります。

であれば、Web サーバーのエラーログにエラーが出ているのではないかと思いますが...


apache 的には...

RewriteRule (.*)$ index.php?p=$1&%{QUERY_STRING} [R=301,L]
【元のURL】http://hoge.com/test/?hello=goodbye
【書き換えのURL】http://hoge.com/?p=test/&hello=goodbye

なら

RewriteRule ^(.*)$ index.php?p=$1 [R=301,L,QSA]

のように、[QSA]フラグでできるんじゃないかなと思いますが....

PHP側で受け取れていないのは、$_SERVER や $_REQUEST あたりで、値が受け取れているか検証してください。

手元の環境では、この1行で、http://example.com/a123/?s=5678 が、http://example.com/index.php?p=a123/&s=5678 にリダイレクトされて、index.php で、$_SERVER['QUERY_STRING']p=a123/&s=5678 で $_REQUEST['p'] が、a123/ となっていて、問題なくデータも取得可能でした。

参考:
QSA|qsappend - RewriteRule Flags 参照。
$_REQUEST

投稿2018/12/19 12:21

CHERRY

総合スコア25171

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

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

helloman

2018/12/20 02:05

QSAの存在を知りませんでした。勉強になります。 うまくいきました。ありがとうございます。 RewriteRule (.*)$ index.php?p=$1&%{QUERY_STRING} [L] これでやると /&s=5678/&s=5678 と二重に設定されてしまっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問