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

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

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

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

URL

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

Webサイト

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

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

Q&A

解決済

2回答

5413閲覧

.htaccessでURLのクエリ文字列を非表示にしたい

NieeeR

総合スコア2

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

URL

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

Webサイト

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

.htaccess

Apacheウェブサーバーにおいて、ディレクトリ単位で設置及び設定を行う設定ファイルを指します。

0グッド

0クリップ

投稿2021/10/19 03:46

編集2021/10/19 05:51

前提

【0】
https://example.com/xxx/にアクセスすると、
https://example.com/xxx/aaa.cgiが表示(DirectoryIndex aaa.cgiで設定済)
このとき、URL欄は『https://example.com/xxx/』

【1】
そのページでcgiの<form>絡みの操作やページ遷移をすると、
URL欄は『https://example.com/xxx/aaa.cgi』になる
→これを、URL欄『https://example.com/xxx/』のままにできるならしたい。希望1

【2】
cgiが作成・表示されるリンクタグ<a href="$script?test=$test&no=$no#link">yyy</a>で遷移すると、
URL欄は『https://example.com/xxx/aaa.cgi?test=01&no=123#link』などになる(01や123の数値は不定)
→これが、URL欄『https://example.com/xxx/』のままにできるならしたい。希望2-a
→次点で、URL欄『https://example.com/xxx/aaa.cgi』とクエリ文字列を非表示・省略できるならしたい。希望2-b

実現したいこと

たとえば以下のようなURL表示を、
https://example.com/xxx/aaa.cgi?test=01&no=123#link

中身はパラメーター通りに動作・処理したいが、ブラウザのアドレスバーはクエリ文字列(URLパラメータ)無しでスッキリ表示したい。
https://example.com/xxx/     ←これがベスト
https://example.com/xxx/aaa.cgi ←無理なら次点で

そもそもhtaccessでは不可能なんでしょうか……?

htaccess

1# 上位ディレクトリ(example)に設置 2<IfModule mod_rewrite.c> 3RewriteEngine On 4RewriteCond %{THE_REQUEST} ^.*/index.html 5RewriteRule ^(.*)index.html$ https://example.com/$1 [R=301,L] 6</IfModule> 7

htaccess

1# 該当ディレクトリ(xxx)に設置 2DirectoryIndex aaa.cgi 3

試したこと・発生している問題

URL欄クエリそのまま(本来のまま)表示される

htaccess

1# 該当ディレクトリ(xxx)に設置 2DirectoryIndex aaa.cgi 3 4<IfModule mod_rewrite.c> 5RewriteEngine on 6RewriteCond %{REQUEST_FILENAME} !-f 7RewriteCond %{REQUEST_FILENAME} !-d 8RewriteRule ^(.*)$ aaa.cgi?$1 [L] 9</IfModule> 10

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

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

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

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

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

yambejp

2021/10/19 03:57

パラメータを渡さなくてよいということでしょうか?
NieeeR

2021/10/19 04:11

(素人で言い回しなど正確でなかったら申し訳ありません) パラメーターは渡してcgiは動作して欲しいが、閲覧者にいちいちクエリ文字などが表示されずURL表示欄がスッキリしているのが希望です。
m.ts10806

2021/10/19 04:20

それならクエリストリングではなくteratailのようにURL自体をパラメータとするように仕組みを組めば良いと思います。 htaccessのほうが先に動作するはずなのでcgi側ではパラメータ受け取れないように思います。 なので、htaccessにすべてのアクセスをindexに集めるようにしてcgi側でURLを解析
NieeeR

2021/10/19 04:50

> URL自体をパラメータとする仕組み > cgi側でURLを解析 素人でここら辺はもう手も足も出ない感じなので私には無理かもです……;
m.ts10806

2021/10/19 05:13

htaccess使う時点で既にかなり難しいかと。サーバー側に影響するものですし。
NieeeR

2021/10/21 07:23

助言ありがとうございました。 ・htaccessでリダイレクトだと、アドレスバーURLからクエリ消せるが、リダイレクトなのでcgiがパラ受け取れない。 ・htaccessでリライトだと、アドレスバーは既にクエリ付URLで、ページの中身を変えることしかできない。 どちらにしてもURLのクエリが付いていないように見せかけるにはhtaccessではない、ということですね。
guest

回答2

0

パラメータを渡しつつurlにパラメータ表示したくないなら
postでパラメータを渡すことです

投稿2021/10/19 04:20

yambejp

総合スコア116724

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

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

NieeeR

2021/10/19 04:46

<form>の所はすべてpostなので、formで動作した後のURL欄はhttps://example.com/xxx/aaa.cgi(クエリは無し)と表示されます。 aaa.cgiも無しの表示に出来るとベストなんですが、index.html無し表示の書き方だと外部転送になってしまいトップから入り直したようになってしまいます。 また、<a href="$script?test=$test&no=$no#link">yyy</a>というようなリンクタグの部分は、URL欄がhttps://example.com/xxx/aaa.cgi?test=01&no=123#linkと表示されます。 これは避けられないのでしょうか。
yambejp

2021/10/19 04:54

避けられる可能性はありますが、意味がないのでやめたほうがよいでしょう。 そもそも何のためにやりたいかを明示されたほうがよいかと
NieeeR

2021/10/19 05:05

何のために→閲覧者にいちいちクエリ文字などが表示されずURL表示欄がスッキリしているのが希望 index.html無し表示のように、xxx/aaa.cgiをxxx/表示にするというほうも「.htaccessでは出来ない」ということでしょうか。
yambejp

2021/10/19 05:13

パラメータを渡すのであれば「.htaccessでは出来ない」という認識で結構です。
NieeeR

2021/10/21 07:24

助言ありがとうございました。了解しました。
guest

0

ベストアンサー

何をしたいのか、質問文からは不明瞭なのですが、もし、
「ユーザーがブラウザにhttps://example.com/xxx/というURLを入力したら、サーバー内部的にはhttps://example.com/xxx/aaa.cgi?test=01&no=123#linkでアクセスされたかのように処理したい。ブラウザのアドレスバーはhttps://example.com/xxx/のまま。」
であれば、

Apache

1RewriteEngine On 2RewriteRule ^xxx/$ /xxx/aaa.cgi?test=01&no=123#link

です。
#追記:修正後の質問への回答

そのページでcgiの<form>絡みの操作やページ遷移をすると、

URL欄は『https://example.com/xxx/aaa.cgi』になる
→これを、URL欄『https://example.com/xxx/』のままにできるならしたい。希望1

<form action="/xxx/aaa.cgi" ~と書いているからでしょう。
<form action="/xxx/" ~と書けばいいです。

中身はパラメーター通りに動作・処理したいが、

パラメーターの情報は、URLのクエリーで渡すか、POSTデータで渡すしか無いです。
つまり、URLのクエリーを使わないのであれば、POSTで渡すしか無いです。aタグのhrefだとPOSTにはできないので、onclickでJavaScriptを動かして、JavaScriptでPOSTするのでしょうか。

投稿2021/10/19 05:14

編集2021/10/19 06:07
otn

総合スコア85901

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

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

NieeeR

2021/10/19 05:53

質問内容を整理して修正しました
NieeeR

2021/10/21 07:38

そ、そっちだったんですね……。 同一ディレクトリなので<form action="">でaaa.cgiはアドレスバーから消えてくれました。 aタグのほうはJavaScriptで対応します。 が、該当部分が割と数多くあるので、JavaScriptで重くなるよりはそのままという選択肢もあるかな、とも考えてます。 とりあえず『https://example.com/xxx/?test=01&no=123#link』などaaa.cgiはアドレスバーから消せたので中身丸見え感が薄らいで良かったです。 たいへん勉強になりました。ありがとうございました!
otn

2021/10/21 07:53

POSTでページ遷移するとなると、<form method="POST" を非表示で必要な数だけ作って、 aタグのonclickで、対応するformをsubmitすることになるかと思います。
yambejp

2021/10/21 08:09

onformdataで処理するほうが楽かもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問