WordPress インストールをWindows上の新しいフォルダーに移動しました/ - IIS サーバー。 PHPで301リダイレクトを設定していますが、機能していないようです。投稿URLの形式は次のとおりです。
http:://www.example.com/OLD_FOLDER/index.php/post-title/
URLの/post-title/
部分を取得する方法がわかりません。
$_SERVER["REQUEST_URI"]
-誰もが推奨しているようです-空の文字列を返しています。 $_SERVER["PHP_SELF"]
は、単にindex.php
を返しています。これはなぜですか、どうすれば修正できますか?
たぶん、あなたはIISの下にいるので、
$_SERVER['PATH_INFO']
説明に使用したURLに基づいて、あなたが望むものです。
Apacheの場合は、$_SERVER['REQUEST_URI']
を使用します。
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
if ($_SERVER["SERVER_PORT"] != "80")
{
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
else
{
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']
Hermanがコメントしたように、HTTP_Host
の代わりにSERVER_NAME
を使用することもできます。完全な議論については この関連する質問 をご覧ください。つまり、どちらを使用しても大丈夫でしょう。 「ホスト」バージョンは次のとおりです。
'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI']
通常、thatを 標準 形式のWebサイトにしたいので、ServerName
にVirtualHost
を設定します。 $_SERVER['HTTP_Host']
は、要求ヘッダーに基づいて設定されます。サーバーがそのIPアドレスの任意またはすべてのドメイン名に応答する場合、ユーザーがヘッダーを偽装するか、さらに悪いことに、誰かがDNSレコードをIPアドレスにポイントして、サーバー/ウェブサイトが動的なウェブサイトを提供する可能性があります誤ったURL上に構築されたリンク。後者の方法を使用する場合は、vhost
を構成するか、.htaccess
ルールを設定して、提供したいドメインを強制する必要があります。
RewriteEngine On
RewriteCond %{HTTP_Host} !(^stackoverflow.com*)$
RewriteRule (.*) https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server
お役に立てば幸いです。この答えの本当のポイントは、Apacheで完全なURLを取得する方法を探しているときにここで終わった人々に最初のコード行を提供することでした:)
$_SERVER['REQUEST_URI']
はIISで動作しませんが、私はこれを見つけました: http://neosmart.net/blog/2006/100-Apache-compliant-request_uri-for-iis-and -windows / これは有望に聞こえます。
このクラスを使用して、URLの動作を取得します。
class VirtualDirectory
{
var $protocol;
var $site;
var $thisfile;
var $real_directories;
var $num_of_real_directories;
var $virtual_directories = array();
var $num_of_virtual_directories = array();
var $baseURL;
var $thisURL;
function VirtualDirectory()
{
$this->protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
$this->site = $this->protocol . '://' . $_SERVER['HTTP_Host'];
$this->thisfile = basename($_SERVER['SCRIPT_FILENAME']);
$this->real_directories = $this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['PHP_SELF'])));
$this->num_of_real_directories = count($this->real_directories);
$this->virtual_directories = array_diff($this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['REQUEST_URI']))),$this->real_directories);
$this->num_of_virtual_directories = count($this->virtual_directories);
$this->baseURL = $this->site . "/" . implode("/", $this->real_directories) . "/";
$this->thisURL = $this->baseURL . implode("/", $this->virtual_directories) . "/";
}
function cleanUp($array)
{
$cleaned_array = array();
foreach($array as $key => $value)
{
$qpos = strpos($value, "?");
if($qpos !== false)
{
break;
}
if($key != "" && $value != "")
{
$cleaned_array[] = $value;
}
}
return $cleaned_array;
}
}
$virdir = new VirtualDirectory();
echo $virdir->thisURL;
追加:
function my_url(){
$url = (!empty($_SERVER['HTTPS'])) ?
"https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] :
"http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
echo $url;
}
次に、my_url
関数を呼び出します。
次の関数を使用して、現在の完全なURLを取得します。これは、IISおよびApacheで動作するはずです。
function get_current_url() {
$protocol = 'http';
if ($_SERVER['SERVER_PORT'] == 443 || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
$protocol .= 's';
$protocol_port = $_SERVER['SERVER_PORT'];
} else {
$protocol_port = 80;
}
$Host = $_SERVER['HTTP_Host'];
$port = $_SERVER['SERVER_PORT'];
$request = $_SERVER['PHP_SELF'];
$query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';
$toret = $protocol . '://' . $Host . ($port == $protocol_port ? '' : ':' . $port) . $request . (empty($query) ? '' : '?' . $query);
return $toret;
}
REQUEST_URIはApacheによって設定されるため、IISでは取得できません。 $ _SERVERでvar_dumpまたはprint_rを実行してみて、使用可能な値がそこにあるか確認してください。
URL のposttitle部分はindex.php
ファイルの後にあります。これはmod_rewriteを使用せずにわかりやすいURLを提供する一般的な方法です。したがって、posttitleは実際にはクエリ文字列の一部であるため、$ _ SERVER ['QUERY_STRING']を使用して取得できます。
$_SERVER['REQUEST_URI']
を使用しているPHPページの上部にある次の行を使用します。これで問題が解決します。
$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
ああ、スニペットの楽しさ!
if (!function_exists('base_url')) {
function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
if (isset($_SERVER['HTTP_Host'])) {
$http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
$hostname = $_SERVER['HTTP_Host'];
$dir = str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
$core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
$core = $core[0];
$tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
$end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
$base_url = sprintf( $tmplt, $http, $hostname, $end );
}
else $base_url = 'http://localhost/';
if ($parse) {
$base_url = parse_url($base_url);
if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
}
return $base_url;
}
}
次のような美しいリターンがあります。
// A URL like http://stackoverflow.com/questions/189113/how-do-i-get-current-page-full-url-in-php-on-a-windows-iis-server:
echo base_url(); // Will produce something like: http://stackoverflow.com/questions/189113/
echo base_url(TRUE); // Will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); //Will produce something like: http://stackoverflow.com/questions/
// And finally:
echo base_url(NULL, NULL, TRUE);
// Will produce something like:
// array(3) {
// ["scheme"]=>
// string(4) "http"
// ["Host"]=>
// string(12) "stackoverflow.com"
// ["path"]=>
// string(35) "/questions/189113/"
// }
次のコードを使用しましたが、正しい結果が得られています...
<?php
function currentPageURL() {
$curpageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {
$curpageURL.= "s";
}
$curpageURL.= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$curpageURL.= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
}
else {
$curpageURL.= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $curpageURL;
}
echo currentPageURL();
?>
私のApacheサーバーでは、これはあなたが探している正確な形式の完全なURLを提供します:
$_SERVER["SCRIPT_URI"]
もう少し堅牢です。 注これは5.3
以上でのみ動作します。
/*
* Compatibility with multiple Host headers.
* Support of "Reverse Proxy" configurations.
*
* Michael Jett <[email protected]>
*/
function base_url() {
$protocol = @$_SERVER['HTTP_X_FORWARDED_PROTO']
?: @$_SERVER['REQUEST_SCHEME']
?: ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https" : "http");
$port = @intval($_SERVER['HTTP_X_FORWARDED_PORT'])
?: @intval($_SERVER["SERVER_PORT"])
?: (($protocol === 'https') ? 443 : 80);
$Host = @explode(":", $_SERVER['HTTP_Host'])[0]
?: @$_SERVER['SERVER_NAME']
?: @$_SERVER['SERVER_ADDR'];
// Don't include port if it's 80 or 443 and the protocol matches
$port = ($protocol === 'https' && $port === 443) || ($protocol === 'http' && $port === 80) ? '' : ':' . $port;
return sprintf('%s://%s%s/%s', $protocol, $Host, $port, @trim(reset(explode("?", $_SERVER['REQUEST_URI'])), '/'));
}
みんな忘れていた http_build_url ?
http_build_url($_SERVER['REQUEST_URI']);
http_build_url
にパラメーターが渡されない場合、自動的に現在のURLが使用されます。 REQUEST_URI
も含まれることを期待しますが、GETパラメーターを含めるために必要なようです。
上記の例は完全なURLを返します。