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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

.htaccess

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

Q&A

解決済

1回答

1171閲覧

.htaccessでの静的URLの設定につきまして

norisuke2211

総合スコア20

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

.htaccess

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

0グッド

0クリップ

投稿2021/04/03 07:05

Perlで構築されているファイル設置型のソフトウェア(メルマガ関連)を共用レンタルサーバー(さくら)に設置いたしました。
基本的な動作は問題なく動いているのですが、静的URL関連でパラメータの受け渡しが出来ておらず、
ご指導頂けますと幸いでございます。

【行なっていること】
・ルートディレクトリ以下にhogeディレクトリを作成
・hoge以下に各種処理プログラム及び.htaccessを設置
・.htaccessで特定の静的URLを設定(IfModule内)

【hoge直下設置の.htaccessの内容】

#Options -Indexes +ExecCGI AddType application/x-httpd-cgi .cgi AddType "text/html: charset=UTF-8" * DirectoryIndex index.cgi <Files ~ ".(pl|pm|tpl|sh)?$"> deny from all </Files> <Files ~ "^.(htaccess|htpasswd)$"> deny from all </Files> <Files ~ "~$"> deny from all </Files> <Files ~ "^_.+$"> SetHandler cgi-script </Files> <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^rm/([^/]*)/([^/]*)/([^/]*)/?$ rm.cgi?m=$1&u=$2&h=$3 RewriteRule ^rm/([^/]*)/([^/]*)/?$ rm.cgi?m=$1&u=$2 RewriteRule ^cs/([^/]*)/([^/]*)/([^/]*)/?$ cs.cgi?m=$1&c=$2&u=$3 RewriteRule ^cs/([^/]*)/([^/]*)/?$ cs.cgi?m=$1&c=$2 RewriteRule ^lmtd/([^/]*)/([^/]*)/([^/]*)/([^/]*)/?$ lmtd.cgi?m=$1&no=$2&h=$3&u=$4 </IfModule>

【事象】
https://domain/hoge/cs/{$1}/{$2}/{$3}の静的URLにアクセスした際、該当のファイルの読み込み(cs.cgi)は出来ておりますが、パラメータ(m,c,u)の取得が出来ていない状況でございます(「パラメータ情報に不備があります」というエラーが表示される)。
動的URLでアクセス(cs.cgi?m=$1&c=$2&u=$3)した際は正常にパラメータを取得できております。
念の為cs.cgiの抜粋内容を記載いたします。

#!/usr/bin/perl package main; use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use DBI; require "./config.cgi"; require "./lib/db.pl"; require "./lib/get.pl"; require "./lib/show.pl"; require "./lib/proc.pl"; require "./lib/item.pl"; require "./lib/default.pl"; $| = 1; my $F = CGI->new(); &db::open(); my $id = $F->param('m'); my $cs_no = $F->param('c'); my $user_no = $F->param('u'); my $redirect; my $errmsg = &item::errmsg_item({id => $id,action => 'cs'}); # <- kida 2.07 //以下の条件にヒットして処理が終了する if(!$id || !$cs_no ){ &show::err_msg(" <p>パラメータ情報に不備があります。</p> <p>WEB管理者までお問い合わせください。</p> "); } ```  【試したこと】 もしかするとIfModuleを通過していないかもしれないと考え、いくつか試した内容が以下になります。 ・<IfModule>を削除して静的URLでアクセス->cs.cgiの処理を実行(パラメータは欠損) →SetHandler cgi-scriptによりcs.cgiが実行された? ・RewriteRule ^cs/([^/]*)/([^/]*)/([^/]*)/?$ cs.cgi?m=$1&c=$2&u=$3 を  RewriteRule ^cs2/([^/]*)/([^/]*)/([^/]*)/?$ cs.cgi?m=$1&c=$2&u=$3 に変更して(cs->cs2)  https://domain/hoge/cs2/{$1}/{$2}/{$3}の静的URLにアクセス →cs.cgiが実行され、パラメータ(m,c,u)も受け渡しされた 【ご指導頂きたいこと】 事象について、.htaccessの記述等が整合していない箇所があるかと考えておりますが、 要修正箇所が特定出来ていない状況である為、不勉強で大変恐れ入りますが、原因箇所をご教授頂けますと幸いです。 【備考】 ・Perlは5.8を使用しております。 ・mod_rewriteは使用できることを確認いたしました。 記載する情報に不足がある場合は別途追記させて頂きます。 お力添え頂けますと幸いです、宜しくお願いいたします。

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

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

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

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

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

otn

2021/04/03 11:39

> もしかするとIfModuleを通過していないかもしれないと考え、 こういう心配をすることになるので、そもそもIfModuleなど書かない方が良いです。 > ・<IfModule>を削除して静的URLでアクセス->cs.cgiの処理を実行(パラメータは欠損) →SetHandler cgi-scriptによりcs.cgiが実行された? ここをもう少し詳しく、事実だけ書いてください。どういうURLに対してどういう事象になったか。
norisuke2211

2021/04/03 15:25

恐れ入ります、事実ではなく認識が入ってしまっておりましたので、 追記致します。 ・<ifModule>を削除した後に、https://domain/hoge/cs/{$1}/{$2}/{$3}形式のURLにアクセス  致しました。(例:https://domain/hoge/cs/test12/1/2) ・その結果、cs.cgiの下記の箇所で処理が終了して「パラメータ情報に不備があります~」のエラーメッセージが画面に表示されて処理は終了致しました。 //以下の条件にヒットして処理が終了する if(!$id || !$cs_no ){ &show::err_msg(" <p>パラメータ情報に不備があります。</p> <p>WEB管理者までお問い合わせください。</p> "); } //以下の条件にヒットして処理が終了する if(!$id || !$cs_no ){ &show::err_msg(" <p>パラメータ情報に不備があります。</p> <p>WEB管理者までお問い合わせください。</p> "); }
otn

2021/04/03 16:32

環境変数 QUERY_STRING を表示してみましょう。
guest

回答1

0

自己解決

閲覧頂きありがとうございました。
自己解決致しましたので、更新させて頂きます。

①以下の2点を試行して、原因の仮説を立てました。
1.RewriteRuleの転送元の^cs/を^cs2/に書き換える
RewriteRule ^cs2/([^/])/([^/])/([^/])/?$ cs.cgi?m=$1&c=$2&u=$3
2.上記の1に加え、転送先の記述をルートパスからの相対パスに変更
RewriteRule ^cs2/([^/]
)/([^/])/([^/])/?$ /hoge/cs.cgi?m=$1&c=$2&u=$3

上記の1,2を変更して.htaccessを/hoge直下にアップロードして、
https://domain/hoge/cs2/{$1}/{$2}/{$3}(例 https://domain/hoge/cs2/test12/1/2)
にアクセスしたところ、cs.cgiに記述された処理が全て正常に実行されました。
これらを踏まえて以下を考えました。
A.https://domain/hoge/cs/{$1}/{$2}/{$3}にアクセスした時に、cs.cgiファイルが存在していた場合はそのままcs.cgiが実行される
B.転送先の記述間違い(上記の2で解消)

Bについては.htaccessの修正で解消致しましたが、Aは何らかのデフォルト設定や.htaccessの記述により、コンテントネゴシエーションが有効になっているのではないかと考え調べたところ、.htaccessには記述されておりませんでしたが、さくらインターネットではデフォルトでMultiViewsが有効とのことでしたので(https://blog.emwai.jp/rentalserver/sakura-htaccess-options/)、/hoge以下に/csディレクトリを作成して/hoge/cs直下にOptions -MultiViewsを記述した.htaccessをアップロードしたところ、当初意図していたhttps://domain/hoge/cs/{$1}/{$2}/{$3}の静的URLで正常にパラメタ取得、後続処理が完了するようになりました。
閲覧頂いた皆様、ありがとうございました。

投稿2021/04/03 17:41

norisuke2211

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問