在我的phpinfo中没有SCRIPT_URI或SCRIPT_URL


No SCRIPT_URI or SCRIPT_URL in my phpinfo

我正在使用Apache 2.0.50和PHP 5.2.11运行WAMP 2.2,我查看了我的phpinfo,但找不到SCRIPT_URI or SCRIPT_URL。我尝试将此脚本添加到我的Apache httpd.conf文件中,但没有成功。有人对SCRIPT_URI or SCRIPT_URL到我的phpinfo有什么想法吗?我需要它作为我在本地机器上运行的网站。

<IfModule rewrite_module>
<IfModule headers_module>
####### INITIAL SETUP #########################
    RewriteEngine on
####### SET HEADERS #########################
    #get and set the host name
        RewriteRule .* - [E=INFO_HTTP_HOST:%{HTTP_HOST},NE]
        RequestHeader set x-orig-host "%{INFO_HTTP_HOST}e"

    #get and set the host port
        RewriteRule .* - [E=INFO_SERVER_PORT:%{SERVER_PORT},NE]
        RequestHeader set x-orig-port "%{INFO_SERVER_PORT}e"

    #If the uri starts with a slash and some alphanumerics, then make a 
    #group of that until the first non-alpha (ie. the next slash)
        RewriteCond %{REQUEST_URI} ^(/['w-]+)
    #Save the content of the regex match group ( %1 ) in an environment variable
        RewriteRule .* - [E=INFO_REQUEST_CONTEXT:%1,NE]
    #Set a header with the content of the environment variable
        RequestHeader set x-orig-context "%{INFO_REQUEST_CONTEXT}e"

    #If the accept-header contains a number after ;version= then make a regex group of that number
        RewriteCond %{HTTP_ACCEPT} '+json;version=('d+)$ 
    #Save the content of the regex match group ( %1 ) in an environment variable
        RewriteRule .* - [E=INFO_ACCEPT_VERSION:%1,NE]
    #Set a header with the content of the environment variable
        RequestHeader set x-orig-accept-version "%{INFO_ACCEPT_VERSION}e"

    #If the accept-header contains kasia2. followed by some letters, 
    #then make a regex group of those letters
        RewriteCond %{HTTP_ACCEPT} kasia2.('w+).*
    #Save the content of the regex match group ( %1 ) in an environment variable
        RewriteRule .* - [E=INFO_ACCEPT_NAME:%1,NE]
    #Set a header with the content of the environment variable
        RequestHeader set x-orig-accept-name "%{INFO_ACCEPT_NAME}e"

    #If https is on ...
        RewriteCond %{HTTPS} on
    #...then set the protocol environment variable to "https"
        RewriteRule .* - [E=INFO_PROTOCOL:https,NE]
    #If https is off ...
        RewriteCond %{HTTPS} off
    #...then we assume it must be "http"
        RewriteRule .* - [E=INFO_PROTOCOL:http,NE]
    #Finally, set the protocol header
        RequestHeader set x-orig-protocol "%{INFO_PROTOCOL}e"

    #Get the request uri and set an environment variable
        RewriteRule .* - [E=INFO_REQUEST_URI:%{REQUEST_URI},NE]
    #Build the whole original url out of the available parts. SCRIPT_URI is always null, otherwise we could have used that.
        RequestHeader set x-orig-url "%{INFO_PROTOCOL}e://%{INFO_HTTP_HOST}e%{INFO_REQUEST_URI}e"
    #In addition make an url with only the host and context, for convenience
        RequestHeader set x-orig-url-base "%{INFO_PROTOCOL}e://%{INFO_HTTP_HOST}e%{INFO_REQUEST_CONTEXT}e"
</IfModule>
</IfModule>

我必须在php.ini文件中做些什么才能让它正常工作吗?

解决方案第一:我认为这是.htaccess与虚拟主机的区别。如果在.htaccess中使用RewriteRule,则会得到REDIRECT_URL集,而如果在主apache配置中的虚拟主机中使用它们,则会获得SCRIPT_URL集。我的解决方案非常实用:

if(array_key_exists('SCRIPT_URL',$_SERVER)){
  $url = $_SERVER['SCRIPT_URL'];
  }
elseif(array_key_exists('REDIRECT_URL',$_SERVER)){
  $url = $_SERVER['REDIRECT_URL'];
  }
else throw...;

背景说明:

我刚刚并排比较了两台服务器,一台(Mint 16,即Ubuntu 13.10)有REDIRECT_URL可用(而SCRIPT_URL而不是),另一台(Ubuntu 14.04)没有设置REDIRECT_*变量,但SCRIPT_URL可用,信息相同。

它们分别是Apache 2.4.6和2.4.7,以及PHP 5.5.3-1ubuntu2.6和5.5.9-1ubuntu4.3。我刚刚并排比较了phpinfo()的输出,除了库中的小版本更改外,它们基本上是相同的,除了REDIRECT与SCRIPT $SERVER变量的差异!(需要彻底说明的是:Mint 16机器在Ubuntu 14没有安装的地方安装了mcrypt,而Ubuntu 14在Mint 16没有安装的位置安装了readline。)

最大的区别是,设置了SCRIPT_URL的服务器在虚拟主机中具有RedirectMatch,并且需要在脚本名称之前有一个明确的正斜杠:

RewriteRule ^.*$ /main.php [NC,L]

而我拥有的所有其他设置REDIRECT_URL的服务器都在.htaccess文件中有规则,不需要正斜杠:

RewriteRule ^.*$ main.php [NC,L]

(在这两种情况下,我都没有明确设置RewriteBase,但手动输入似乎表明了我不需要它的原因,这也向我表明,机制可能足够不同,可以设置不同的环境变量。)

在上面的脚本中添加了这一行,现在它可以使用RewriteEngine On