0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

$_SERVER['SCRIPT_URI']が使えたり使えなかったり

Last updated at Posted at 2017-09-27

他人が書いたコードを読んでいたら "$_SERVER['SCRIPT_URI']" というのが出てきたのだが
PHPのドキュメントの$_SERVERのところには載っていなかった。
URLリライト(mod_rewrite)由来の値らしい。ただ、URLリライトが使えるからといって必ず $_SERVER['SCRIPT_URI'] が使えるとは限らない。この辺りがよくわからない。

下記の .htaccess と index.php をドキュメントルートに置いてアクセスした場合の $_SERVER のSCRIPT_URI、REQUEST_URI、SCRIPT_NAME を調べた。
#ドメイン名はダミー。

.htaccess
RewriteEngine On

ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /index.php
index.php
<?php
echo "_SERVER[SCRIPT_URI]={$_SERVER['SCRIPT_URI']}" . PHP_EOL;
echo "_SERVER[REQUEST_URI]={$_SERVER['REQUEST_URI']}" . PHP_EOL;
echo "_SERVER[SCRIPT_NAME]={$_SERVER['SCRIPT_NAME']}" . PHP_EOL;

$_SERVER['SCRIPT_URI'] が使えたケース

環境:
Apache/2.2.15
PHP 5.3.3

"http://www.mogero.jp/" にアクセスした場合

_SERVER[SCRIPT_URI]=http://www.mogero.jp/
_SERVER[REQUEST_URI]=/
_SERVER[SCRIPT_NAME]=/index.php

"http://www.mogero.jp/index.php" にアクセスした場合

_SERVER[SCRIPT_URI]=http://www.mogero.jp/index.php
_SERVER[REQUEST_URI]=/index.php
_SERVER[SCRIPT_NAME]=/index.php

"http://www.mogero.jp/index.php?mode=test" にアクセスした場合

_SERVER[SCRIPT_URI]=http://www.mogero.jp/index.php
_SERVER[REQUEST_URI]=/index.php?mode=test
_SERVER[SCRIPT_NAME]=/index.php

"http://www.mogero.jp/hoge" にアクセスした場合

_SERVER[SCRIPT_URI]=http://www.mogero.jp/hoge
_SERVER[REQUEST_URI]=/hoge
_SERVER[SCRIPT_NAME]=/index.php

$_SERVER['SCRIPT_URI'] が使えなかったケース

環境:
Apache/2.4.6
PHP 7.0.14

"http://www.into-main.jp/" にアクセスした場合

_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/
_SERVER[SCRIPT_NAME]=/index.php

"http://www.mogero.jp/index.php" にアクセスした場合

_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/index.php
_SERVER[SCRIPT_NAME]=/index.php

"http://www.mogero.jp/index.php?mode=test" にアクセスした場合

_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/index.php?mode=test
_SERVER[SCRIPT_NAME]=/index.php

"http://www.mogero.jp/hoge" にアクセスした場合

_SERVER[SCRIPT_URI]=
_SERVER[REQUEST_URI]=/hoge
_SERVER[SCRIPT_NAME]=/index.php

まとめ

SCRIPT_URI は使えないこともあるので、使わない方がいいかも。

SCRIPT_URI が使えなくても

  • HTTPS:HTTPSプロトコルの場合、値がセットされる
  • HTTP_HOST:HTTPリクエストのHOSTヘッダの値
  • REQUEST_URI

でURLを作ることができる。SCRIPT_URIと違ってクエリーストリングが付いてしまうが。
HTTP_HOST は改ざんされている可能性があるのでちゃんと検証しましょう。

REQUEST_URI と SCRIPT_NAME は似ているが以下のように違う。

  • REQUEST_URI:アクセスのURLのパス部
  • SCRIPT_NAME:実行されるスクリプトのドキュメントルートからのパス

参考ページ

PHP: $_SERVER - Manual
php - $_SERVER["SCRIPT_URI"] not working? alternative? - Stack Overflow
Apache の基本 -バーチャルホスト編- | バシャログ。
Apache : mod_rewriteリファレンス - dawgsdk.org

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?