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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

3901閲覧

phpのページの不正なURL表記について

rfj

総合スコア8

Webサーバー

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/04/11 09:14

編集2018/04/11 09:47

PHPのページのURLについて、
http://hogehoge.com/hoge.php/test/abcde のように、
ページ名の後ろに「/test~~」といった形で、スラッシュで区切って文字を追記すると、
なぜか http://hogehoge.com/hoge.php のページにアクセスすることができてしまいます。
(ただし、現在地のディレクトリはhogehoge.com/hoge.php/test/abcdeと認識されるからか、
相対指定のディレクトリ表記でCSSや画像を指定している箇所は正常に表示されません)

htmlのページでこのようなURLの書き方をすると404エラーになるのに、
何故phpのページではアクセスできてしまうのでしょうか?

上記のような不正なURLへのアクセスがあった場合、
.htaccessなどで「.php」以降の部分を省いたURLへリダイレクトさせることはできますでしょうか。
できれば、不正なURLは阻止しつつ、GET変数でのパラメータ受け取りは行えるようにしたいです。

【04/11 18:36追記】
サーバーの環境はApache 2.4.20とPHP 7.0.15、PHP 5.6.30です。
ルートディレクトリに設置している.htaccessには、以下の内容を記載しています。

PHP_value default_charset none PHP_value output_handler none <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{THE_REQUEST} ^.*/index.php RewriteRule ^(.*)index.php$ http://www.hogehoge.com/$1 [R=301,L] RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ http://www.hogehoge.com/$1 [R=301,L] RewriteCond %{REQUEST_URI} ^/index.php/.*$ RewriteRule ^(.*)index.php$ http://www.hogehoge.com/ [R=301,L] RewriteCond %{HTTP_HOST} ^hogehoge.com RewriteRule (.*) http://www.hogehoge.com/$1 [R=301,L] ErrorDocument 404 /404.html RewriteCond %{REQUEST_URI} !^/contact/.*$ RewriteCond %{REQUEST_URI} !(.*css$) RewriteCond %{REQUEST_URI} !(.*jpg$) RewriteCond %{REQUEST_URI} !(.*png$) RewriteCond %{REQUEST_URI} !(.*gif$) RewriteCond %{REQUEST_URI} !(.*js$) RewriteCond %{REQUEST_URI} !(.*ttf$) RewriteCond %{REQUEST_URI} !(.*woff$) RewriteCond %{REQUEST_URI} !(.*eot$) RewriteCond %{REQUEST_URI} !(.*otf$) RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L] </IfModule> # MIME Type 追加 <IfModule mime_module> AddType text/cache-manifest .appcache AddType image/x-icon .ico AddType image/svg+xml .svg AddType application/x-font-ttf .ttf AddType application/x-font-woff .woff AddType application/x-font-woff2 .woff2 AddType application/x-font-opentype .otf AddType application/vnd.ms-fontobject .eot </IfModule> # ETags(Configure entity tags) を無視する設定 <ifModule mod_headers.c> Header unset ETag </ifModule> FileETag None # Enable Keep-Alive を設定 <IfModule mod_headers.c> Header set Connection keep-alive </IfModule> #圧縮の設定 <ifModule mod_deflate.c> <IfModule mod_filter.c> # 古いブラウザでは無効 BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch \bMSIE\s(7|8) !no-gzip !gzip-only-text/html # 画像など圧縮済みのコンテンツは再圧縮しない SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|ico|eot|woff|woff2)$ no-gzip dont-vary AddOutputFilterByType DEFLATE text/html text/xml text/css text/plain AddOutputFilterByType DEFLATE image/svg+xml application/xhtml+xml application/xml AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript application/json AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-otf AddOutputFilterByType DEFLATE font/truetype font/opentype </IfModule> </ifModule> #ブラウザキャッシュの設定 <IfModule mod_headers.c> <ifModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 1 days" # CSS ExpiresByType text/css "access plus 1 days" # RSS ExpiresByType application/atom+xml "access plus 1 hours" ExpiresByType application/rdf+xml "access plus 1 hours" ExpiresByType application/rss+xml "access plus 1 hours" # データはキャッシュさせない ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/ld+json "access plus 0 seconds" ExpiresByType application/schema+json "access plus 0 seconds" ExpiresByType application/vnd.geo+json "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" # Favicon ExpiresByType image/vnd.microsoft.icon "access plus 1 weeks" ExpiresByType image/x-icon "access plus 1 weeks" # HTML ExpiresByType text/html "access plus 0 seconds" # JavaScript ExpiresByType application/javascript "access plus 1 weeks" ExpiresByType application/x-javascript "access plus 1 weeks" ExpiresByType text/javascript "access plus 1 weeks" # マニフェスト ExpiresByType application/manifest+json "access plus 1 weeks" ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" ExpiresByType text/cache-manifest "access plus 0 seconds" # 画像や動画 ExpiresByType audio/ogg "access plus 1 weeks" ExpiresByType image/bmp "access plus 1 weeks" ExpiresByType image/gif "access plus 1 weeks" ExpiresByType image/jpeg "access plus 1 weeks" ExpiresByType image/png "access plus 1 weeks" ExpiresByType image/svg+xml "access plus 1 weeks" ExpiresByType image/webp "access plus 1 weeks" ExpiresByType video/mp4 "access plus 1 weeks" ExpiresByType video/ogg "access plus 1 weeks" ExpiresByType video/webm "access plus 1 weeks" # Webフォント # Embedded OpenType (EOT) ExpiresByType application/vnd.ms-fontobject "access plus 1 months" ExpiresByType font/eot "access plus 1 months" # OpenType ExpiresByType font/opentype "access plus 1 months" # TrueType ExpiresByType application/x-font-ttf "access plus 1 months" # Web Open Font Format (WOFF) 1.0 ExpiresByType application/font-woff "access plus 1 months" ExpiresByType application/x-font-woff "access plus 1 months" ExpiresByType font/woff "access plus 1 months" # Web Open Font Format (WOFF) 2.0 ExpiresByType application/font-woff2 "access plus 1 months" # Other ExpiresByType text/x-cross-domain-policy "access plus 1 weeks" </IfModule>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/04/11 09:20

webサーバーの種類(多分apache httpd?)と、hoge.phpが置いてあるディレクトリに既に.htaccessを配置しているかどうか、配置していればその内容も示してほしい。
退会済みユーザー

退会済みユーザー

2018/04/11 09:45

設定ファイルはコード表記で囲ってください
guest

回答2

0

ベストアンサー

フレームワーク利用してないということなので

RewriteEngine ON RewriteCond %{REQUEST_URI} .php/(.*) [NC] RewriteRule ^.*$ / [R,L]

Before: http://www.example.com/index.php/aa
After : http://www.example.com/

のようにしてしまえば ***.php/ 形式をすべて防げます。

フレームワーク利用時は使用しないでください

おまけ

*.php より後ろを削除する

RewriteEngine ON # RewriteBase を指定することで書き換え範囲を絞る必要がある RewriteBase / RewriteCond %{REQUEST_URI} .php/(.*) [NC] RewriteRule ^(.*.php)/.*$ $1 [R,L]

Before: http://www.example.com/index.php/aa
After : http://www.example.com/index.php


過去の解答

基本的にその手の記述ができる PHP フレームワークにはそれなりの機能(ドキュメントルート相対変換処理)があったりします。
相対パス記述は基本的に誤りです。

laravel

https://readouble.com/laravel/5.3/ja/helpers.html#method-asset

symfony

https://symfony.com/doc/3.4/frontend/assetic/asset_management.html

cakephp

https://book.cakephp.org/2.0/ja/core-libraries/helpers/html.html#HtmlHelper::script
https://book.cakephp.org/2.0/ja/core-libraries/helpers/html.html#HtmlHelper::css
https://book.cakephp.org/2.0/ja/core-libraries/helpers/html.html#HtmlHelper::image

etc....

投稿2018/04/11 09:31

編集2018/04/11 10:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rfj

2018/04/11 09:46

今回ご相談させて頂いているページは、フレームワークを使用していないページですので、残念ながらこれらの対策では対応できなさそうです。ご回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/04/11 10:07

とりま他に影響が発生しない言質がとれたので その手のパスを完全封殺するのを追記しました
rfj

2018/04/11 10:11

追記して頂いた部分を載せたら解決しました!ありがとうございます!
rfj

2018/04/11 10:12

すみません、追加で1点質問があります。同じサイトの別ディレクトリでWordpressを使用しているのですが、このhtaccessの記述があると問題が発生する恐れはありますでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/11 10:24

RewriteConde で wordpress のディレクトリを除外しなかったら影響は出るはずですね
rfj

2018/04/11 10:31

Wordpressのディレクトリは除外するルールを追加して使ってみます。ありがとうございました!
guest

0

hoge.phpにパラメータを渡す前にある程度拒否したい、ということでしょうか。

mod_rewriteでのurl書き換えにおいて、
不正とみなす正規表現パターンを記述して拒絶すればよいのではないかと。
mod_rewrite - Apache HTTP Server Version 2.4

mod_rewriteの振る舞いを確認するには:
Apache 2.4 系で mod_rewrite のログを出力させるには


htmlのページでこのようなURLの書き方をすると404エラーになるのに、
何故phpのページではアクセスできてしまうのでしょうか?

そうなるように、hoge.phpのディレクトリに.htaccessがあってurl書き換えなどが設定されているから。
あるいは、サーバーのhttpd.confで(以下略)

投稿2018/04/11 09:29

編集2018/04/11 09:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/04/11 09:35

この記述は mod_php による許容された書き方 (mod_rewrite が使えない環境でも これでルーティングができます)
rfj

2018/04/11 09:40

追記した内容のように、index.htmlへのアクセスをディレクトリ名までのアクセスに統一する等の設定は、現在も.htaccessで行っています。同じ要領で、 /index.php/ という表記を含むURLへのアクセスを正常な表記にリダイレクトしようとしたのですが、その書き方が分からなくて困っています…。
退会済みユーザー

退会済みユーザー

2018/04/11 09:51 編集

%{THE_REQUEST} でのマッチングって例えば「GET /index.html HTTP/1.1」的な文字列なので、出来なくもないけどかえって面倒な気もする。%{REQUEST_URI}ならいわゆるQUERY_STRINGな部分のない部分なので、こっちに統一すると良いかも。
rfj

2018/04/11 09:58

%{THE_REQUEST} の部分を%{REQUEST_URI}に修正しましたが、不正なURLでアクセス出来るのは相変わらずですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問