他人が書いたコードを読んでいたら "$_SERVER['SCRIPT_URI']" というのが出てきたのだが
PHPのドキュメントの$_SERVERのところには載っていなかった。
URLリライト(mod_rewrite)由来の値らしい。ただ、URLリライトが使えるからといって必ず $_SERVER['SCRIPT_URI'] が使えるとは限らない。この辺りがよくわからない。
下記の .htaccess と index.php をドキュメントルートに置いてアクセスした場合の $_SERVER のSCRIPT_URI、REQUEST_URI、SCRIPT_NAME を調べた。
#ドメイン名はダミー。
RewriteEngine On
ErrorDocument 401 /index.php
ErrorDocument 403 /index.php
ErrorDocument 404 /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