PHP URL 参数重定向 - 使用通配符/正则表达式



我最近找到了这个解决方案,用于执行php url变量到标头位置的重定向。

与用于大规模重定向的 htaccess 相比,它更易于管理,但是我接下来想解决的一件事是,我如何使用正则表达式来实现您可以使用 htaccess 执行的操作,其中请求/(.*) 转到目的地/$1。

我的把握是你用preg_match或preg_replace什么的。我怎样才能实现如下目标,如果可能的话,最好保持简短。(我知道这是错误的,顺便说一句,只是为了一个例子)。

preg_match($redirects['request(.*)'] = "$domain/destination/1");

基本上分解一下,假设我想将doma.in/pics重定向到domain.tld/pictures,我有htaccess将其重定向到doma.in/index?req=pics,其中索引是脚本文件,req是使用的参数。

然后使用脚本我有一行类似$redirects['pics'] = "$domain/pictures";,其中$domain变量与http://domain.tld相关联。

这很好用,但是我想用正则表达式更进一步,并将任何pics/*stuff*,也就是doma.in/index?req=pics/*stuff*发送到$domain/pictures/*stuff*

下面是使用此脚本执行许多重定向的示例。

$redirects['request'] = "$domain/dest";
$redirects['request2'] = "$domain/dest2";
$redirects['request3'] = "$domain/dest3";

即使我已经链接了顶部的帖子,我得到了我正在使用的脚本,但这是代码:

if(isset($_GET['req']) && isset($redirects[$_GET['req']])) {
$loc = htmlspecialchars($redirects[$_GET['req']]);
header("Location: " . $loc);
exit();
}
header("Location: $domain");

上面包含$redirects行,我在包含的文件中有这些行。

这是一个很长的阅读,而且这样做的方式很混乱。请参阅我接受的答案,以获取更好的方法。

我认为ltrim()是我想要的,在其他答案上看到,例如,如果我指定 0 作为要删除的内容,01 将变为 1,001 将变为 01,10 将保留为 10,100 为 100,依此类推。然而,事实并非如此。相反,它将剥离所述字符的所有实例。虽然它不是用斜杠做的,所以很困惑。

但是,这是正确的:

if (strpos($get, $req) === 0) {
$get = substr($get, strlen($req));
}
return $get;

感谢这个班轮的答案。

我在这里使用此脚本所做的只是将$redirects['request']分配给关联的值,就像任何其他变量值分配一样。而且$_GET['req']已经完成了无论参数是什么都能恢复的工作,因此没有复杂的preg或正则表达式或任何东西。

所以有了这个substr(),我们可以采用$_GET['req']并执行以下操作:

$req = "pics/";
$get = $_GET['req'];
$wild = strpos($get, $req) === 0
? substr($get, strlen($req))
: $get;
$redirects["pics/$wild"] = "$domain/pictures/$wild";

这需要pics/*stuff*并删除pics/,因此$wild的值等于*stuff*,所以我只是在重定向中使用它来制作通配符和 taadaa。

这是完全有效的,但让我们让它变得更好,以节省每次记住这段代码的时间,这是相当多的。

在重定向上方创建一个这样的函数:

function wildcard($req) {
$get = $_GET['req'];
return strpos($get, $req) === 0
? substr($get, strlen($req))
: $get;
}

通过调用wildcard('pics/');$req等于pics/

我们可以在重定向中使用它,例如:

$req = "pics/";
$wild = wildcard($req);
$redirects[$req.$wild] = "$domain/pictures/$wild";

它仍然比我希望的要多一点,所以我的想法是将$req调用为函数中的全局,如下所示:

function wild() {
$get = $_GET['req']; global $req;
return strpos($get, $req) === 0
? substr($get, strlen($req))
: $get;
}

然后像这样进行重定向:

$req = "pics/";
$redirects[$req.wild()] = "$domain/pictures/".wild();

这变成了一条更短的单行。虽然关于使用全局变量的冲突,我只是把它放回原样,但没有重复分配$wild,只需$req放回wild()里面,让它像:

$req = "pics/";    $redirects[$req.wild($req)] = "$domain/pictures/".wild($req);

无论如何,它仍然较短,并且对于括号为空并不多。

附言,此方法,您希望在参数中包含尾部斜杠,以便结果不会变得混乱。 为了实现能够将pics发送到$domain/pictures,我们希望在参数的末尾有一个尾部斜杠。在 htaccess 中的重定向规则中,要将请求作为参数发送到脚本,请在末尾添加尾部斜杠。因此,如果您使用的是 Apache 或 Litespeed,则可以在 htaccess 中执行以下操作,将所有请求作为参数发送到您的脚本,并带有尾部斜杠,如下所示:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?req=$1/ [R=301,L]

确保它位于底部,这样它就不会优先于其他规则。

还为脚本添加了一个预防性rtrim(),以删除标头位置中的尾部斜杠,因此,如果要链接任何不删除文件链接上的尾部斜杠的内容,它不会转到死链接。由于斜杠再次不受我在顶部提到的发现的行为的影响,这在这里很好。

这是你现在拥有东西的方式。

function wild($req) {
$get = $_GET['req'];
return strpos($get, $req) === 0
? substr($get, strlen($req))
: $get;
}
$domain = "http://domain.tld";
// Redirects
$req = "request1/";    $redirects[$req.wild($req)] = "$domain/dest1/".wild($req);
$req = "request2/";    $redirects[$req.wild($req)] = "$domain/dest2/".wild($req);
$req = "request3/";    $redirects[$req.wild($req)] = "$domain/dest3/".wild($req);
// Run Script
if (isset($_GET['req'], $redirects[$_GET['req']])) {
$loc = htmlspecialchars($redirects[$_GET['req']]);
header("Location: " . rtrim($loc,"/"));
exit();
}
// If no match in the redirects, redirect to this location.
header("Location: $domain");

现在,如果目标向脚本发送不存在的请求,如果一个目标(将使用通配符保证)对于请求不存在,则它有一个缺陷,那么它回到脚本并有一个重定向循环。

我解决此问题的方法是将?referer=doma.in添加到标头位置的末尾,并在 domain.tld 上的 htaccess 中,排除具有该查询字符串的不存在的请求,使其重定向回脚本。

所以它看起来像:

$loc = htmlspecialchars($redirects[$_GET['req']]).'?referer=doma.in';

在 domain.tld 的 htaccess 中,在现有规则上方放置一个重写,如下所示以排除查询字符串:

# Ignore these referer queries
RewriteCond %{QUERY_STRING} !referer=doma.in [NC]
# Send dead requests to doma.in with uri as query
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://doma.in/?referer=domain.tld&req=$1/ [R=301,L]

为了更好地衡量,我还在 domain.tld 的重定向中添加了一个引用。

现在,作为奖励,为了隐藏对整理内容的请求的引用查询,让我们在下面添加:

# Send dead requests with referer query to home (or 404 or wherever)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} "referer=" [NC]
RewriteRule (.*) /?req=$1 [R=301,L]
# Remove referer query from requests
RewriteCond %{QUERY_STRING} "referer=" [NC]
RewriteRule (.*) /$1/? [R=301,L]

在删除查询之前,我们需要在某个地方发送死引用查询请求,否则我们将回到第一步。我将死请求发送到我的主页,并将请求 uri 作为参数,以便仍然可以知道请求 url 是什么。

工作完成了。但作为额外的好处,让我们使外部/非通配符重定向没有查询。所以回到脚本中,将脚本更改为这样:

$get = $_GET['req'];
$loc = $redirects[$get];
$wildloc = $wildcards[$get];
// Run Script
if(isset($get) && isset($loc) || isset($wildloc)) {
if(isset($wildcards[$get])) {
$loc = rtrim($wildloc,'/').'?referer=hwl.li'; }
$loc = rtrim(htmlspecialchars($loc),'/');
header("Location: ".$loc);
exit();
}

在这里,我已经移动了分配给$get$_GET['req']$redirects[$get]分配给$loc$wildcards[$get]分配给$wildloc,并在isset中调用它们,以及在:后的额外isset,也就是$wildlocOR

然后有一个if语句,以便重定向使用分配给$wildloc$wildcards$loc$redirects使用上面的一个。

这样,我们可以有整洁的重定向。

所以现在事情看起来像:

// Wildcard function
function wild($req) {
$get = $_GET['req'];
return strpos($get, $req) === 0
? substr($get, strlen($req))
: $get;
}
$domain = "http://domain.tld";
// Redirects
$req = "request1/";   $wildcards[$req.wild($req)] = "$domain/dest1/".wild($req);  // A wildcard redirect
$req = "request2/";    $wildcards[$req.wild($req)] = "$domain/dest2/".wild($req);  // A wildcard redirect
$redirects['request3/'] = "$domain/dest3/"; // Not a wildcard redirect
$get = $_GET['req'];
$loc = $redirects[$get];
$wildloc = $wildcards[$get];
// Run Script
if(isset($get) && isset($loc) || isset($wildloc)) {
if(isset($wildcards[$get])) {
$loc = rtrim($wildloc,'/').'?referer=hwl.li';}
$loc = rtrim(htmlspecialchars($loc),'/');
header("Location: ".$loc);
exit();
}
// If no match in the redirects, redirect to this location.
header("Location: $domain/?req=$get");

这大大改善了事情并解决了重定向循环。

再次稍微编辑了一下,就像我在这里对附加查询字符串所做的那样......因此,rtrim()在那之后正在寻找一个不存在的尾部斜杠,而不是我们希望它之前这样做的地方。所以现在rtrim()来了。加倍它有点烦人,但至少它现在可以完成工作。

更新的脚本

我已经彻底修改了这个脚本,现在我已经意识到这完全是我们在这里做的一个数组,每个重定向都只是添加到它。此外,我还学到了很多关于功能的知识,它现在非常便携,同时也做了很多。

这是完整的新脚本。与前一个相比,这是一个野兽,但前一个太乱了。

function redirects($config) {                           // Create a redirects(); function with the inputted array set as $config
// Config Variables
$req = $config['param'];                                // Assign $req to the $config param value 
$dir = $config['dir'];                                  // Assign $dir to the $config dir value
$domain = $config['domain'];                            // Assign $domain to the $config domain value
$_404   = $config['404'];                               // Assign $_404 to this $config 404 value
$_referer = $config['referer'];                         // Assign $referer_ to the referer value
$referer = 'referer='.$_referer;                        // Assign $referer to the full referer param
if (isset($_GET[$_referer])) {
if ($_GET[$_referer] == $_referer) {                    // If this script's referer exists,
echo "Do not loop back to the script!";             // Throw a warning
exit();                                             // & exit
}                                                       // Otherwise continue
}
if (isset($_GET[$req]) && !empty($_GET[$req])) {                // If a req parameter exists & isn't empty, continue
$req = $_GET[$req];                                         // Assign $req to $_GET[$req]
// Create the arrays
$redirects = $wildcards = $halfwilds = array();             // Create the arrays needed, so if there's not at least one redirect done, which would be what creates the array otherwise, there won't be a 500 error due to it. 
// Redirect includes
foreach (glob($dir) as $filename) {                         // Search for all redirect php files at $dir location
include $filename;                                      // Include those files
}
// Leading & Trailing Slashes
$req = '/'.trim($req, '/').'/';                             // Add a leading & trailing slash to $req param if non existent

function redir_editkeys($array) {                           // Create an editkeys(); function and pass the specified array as $array
$keys = array_keys($array);                                 // Extract the keys of the array as values of $keys array
foreach ($keys as &$value) {
$value = '/'.trim($value, '/').'/';                     // Add a leading & trailing slash to $keys values if non existent
}
return array_combine($keys, $array);                        // Replace the original array's keys with the modified keys & return
}
// Referer
function referer($redir, $referer, $domain) {               // Create a referer(); function and pass to it $redir, $referer, & $domain.
if (strpos($redir, $domain) !==false) {                     // Using $domain, check $redir for a match.
$redir = $redir.'?'.$referer;                           // If there's a match, add the referer param
}   return $redir;                                          // Return the edited $redir, or if no match, return without editing
}
// Redirects
$redirects = redir_editkeys($redirects);                    // Edit $redirects keys using editkeys();
if (isset($redirects[$req])) {                              // Check that $redirects[$req] exists
$redir = $redirects[$req];                              // Assign $redir to $redirects[$req];
$redir = referer($redir, $referer, $domain);            // If it does, run referer();
header("Location: $redir");                             // & Redirect
exit();                                                 
}
// Wildcards
$wildcards = redir_editkeys($wildcards);                    // Edit $wildcards keys using editkeys();
foreach ($wildcards as $key => $value) {                    // Assign variables to $wildcards keys & values
if (strpos($req, $key) !== false) {                     // Using $key, check $req for a match
$wild = substr($req, strlen($key));                 // Extract everything after the match as $wild
$req = substr($req, 0, strlen($key));               // Extract the matching part at the beginning as $req
if (isset($wildcards[$req])) {                      // Check that $wildcards[$req] exists
$redir = $wildcards[$req];                      // Assign $redir to $wildcards[$req]
$redir = $redir.$wild;                          // Attach $wild onto $redir
$redir = referer($redir, $referer, $domain);    // If it does, run referer();
header("Location: $redir");                     // & Redirect
exit();             
}
}
}
// Half Wilds
$halfwilds = redir_editkeys($halfwilds);                    // Edit $halfwilds keys using editkeys();
foreach ($halfwilds as $key => $value) {                    // Assign variables to $halfwilds keys & values
if (strpos($req, $key) !== false) {                     // Using $key, check $req for a match
$req = substr($req, 0, strlen($key));               // Extract the matching part at the beginning as $req
if (isset($halfcards[$req])) {                      // Check that $halfwilds[$req] exists
$redir = $halfwilds[$req];                      // Assign $redir to $halfwilds[$req]
$redir = referer($redir, $referer, $domain);    // If it does, run referer();
header("Location: $redir");                     // & Redirect
exit();             
}
}
}
// 404
$req = "req=".trim($req,'/')."&";                           // Attach the param name to the $req value for the 404 redirect if it's not empty and remove the slashes.
}   
else { $req = ''; }                                         // If no req param, or if empty, unset $req
header("Location: ".$domain.$_404."?".$req.$referer);       // If there's no match, redirect to this location.
}

我们通过以下方式调用此脚本:

redirects(
array( // Config
'param'   => 'req',                   //  Param name                 ||  Set the name of the url param. Here it is "req".
'dir'     => 'redirects/*/*.php',     //  Redirect file(s) location  ||  Set the location to look for the file(s) you store your redirects. Here I have my files in sub folders of a rediects folder. Do not put a leading slash infront, use "../" etc as it must be relative, not absolute..
'domain'  => 'http://domain.tld',     //  Your domain                ||  Set your website's domain name here. This'll be used to check whether redirects go to it and if the referer is needed.
'404'     => '/',                     //  404 location               ||  Set the location 404s will go to. Hereit is just my homepage, so I've put "/".
'referer' => 'redirector'             //  Referer param              ||  Set the value of the referer param that will be used in redirects to the same site so we can stop 404s resulting in a loop.
)
);

要进行简单的重定向,我们可以执行以下操作:

$redirects['request1'] = "$domain/dest1";
$redirects['request2'] = "$domain/dest2";

要做通配符,我们可以这样做:(确保在末尾添加尾部斜杠,除非它是目标,例如查询字符串)

$wildcards['request3'] = "$domain/dest3/";
$wildcards['request4'] = "$domain/dest4/";

而且我还添加了半通配符,所以如果你想把request5/anypath发送到$domain/dest5,而不是dest5/anypath,我们可以这样做:

$halfwilds['request5'] = "$domain/dest5";
$halfwilds['request6'] = "$domain/dest6";

让我们将其拆分为块,并查看每个部分在做什么:

<小时 />
  1. 配置:

首先,我们以$config数组作为参数启动redirects();函数。然后我们为每个设置分配变量。

function redirects($config) {                           // Create a redirects(); function with the inputted array set as $config
// Config Variables
$req = $config['param'];                                // Assign $req to the $config param value 
$dir = $config['dir'];                                  // Assign $dir to the $config dir value
$domain = $config['domain'];                            // Assign $domain to the $config domain value
$_404   = $config['404'];                               // Assign $_404 to this $config 404 value
$_referer = $config['referer'];                         // Assign $referer_ to the referer value
$referer = 'referer='.$_referer;                        // Assign $referer to the full referer param

我们有两个用于引用的变量,一个用于引用器值,第二个用于连接为用于重定向的完整参数。


  1. 引用检查

我首先检查了请求中是否存在此脚本的引用参数,只需简单地说"Do not loop back to the script!",然后exit();脚本。

if (isset($_GET[$_referer])) {
if ($_GET[$_referer] == $_referer) {                    // If this script's referer exists,
echo "Do not loop back to the script!";             // Throw a warning
exit();                                             // & exit
}                                                       // Otherwise continue
}

  1. 数组和包含

接下来,如果请求中的引用参数不匹配,当 req 参数存在且不为空时,我们打开一个 if,创建空数组,然后包含我们在配置中声明的位置我们放置重定向。

if (isset($_GET[$req]) && !empty($_GET[$req])) {                // If a req parameter exists & isn't empty, continue
$req = $_GET[$req];                                         // Assign $req to $_GET[$req]
// Create the arrays
$redirects = $wildcards = $halfwilds = array();             // Create the arrays needed, so if there's not at least one redirect done, which would be what creates the array otherwise, there won't be a 500 error due to it. 
// Redirect includes
foreach (glob($dir) as $filename) {                         // Search for all redirect php files at $dir location
include $filename;                                      // Include those files
}

根据我对 php 工作方式的理解,这实际上有一个好处,将包含放在 if 中,如果不满足条件,当请求没有 req 参数时就是这种情况,包含甚至不会被处理。


  1. 前导和尾随斜杠

按照以前的脚本的情况,我们必须确保在重定向键的末尾添加斜杠,并在参数末尾使用尾部斜杠向脚本发送请求。让我们通过使用trim();来消除这样做的需要,如果它存在并重新添加它,再加上一个前导斜杠,以确保当我们想要寻找"狗/"时strpos();不会匹配"猫狗/"。

// Leading & Trailing Slashes
$req = '/'.trim($req, '/').'/';                             // Add a leading & trailing slash to $req param if non existent

function redir_editkeys($array) {                           // Create an editkeys(); function and pass the specified array as $array
$keys = array_keys($array);                                 // Extract the keys of the array as values of $keys array
foreach ($keys as &$value) {
$value = '/'.trim($value, '/').'/';                     // Add a leading & trailing slash to $keys values if non existent
}
return array_combine($keys, $array);                        // Replace the original array's keys with the modified keys & return
}

在这里,我们创建了一个名为editkeys();的函数,该函数创建您传递给它的任何数组的键的新数组,执行 foreach 修改这些键,然后将它们放回原始数组中,替换原始键。


  1. 目标域 检查是否需要引用参数

如果我们将目标的 404 请求发送到脚本,我们希望停止重定向到以 404s 结尾的该目标的重定向循环。我们可以始终添加引用参数,但这可能会根据该目的地的网站配置对查询字符串的处理而冒着窃听的风险。因此,让我们做一个函数来检查传递的目的地是否转到$domain,如果为 true,则向其添加引用器并将其返回。

// Referer
function referer($redir, $referer, $domain) {               // Create a referer(); function and pass to it $redir, $referer, & $domain.
if (strpos($redir, $domain) !==false) {                     // Using $domain, check $redir for a match.
$redir = $redir.'?'.$referer;                           // If there's a match, add the referer param
}   return $redir;                                          // Return the edited $redir, or if no match, return without editing
}

  1. 重定向

接下来,我们有将重定向组合在一起的部分。首先,我们有简单的重定向。首先,我们通过editkeys();函数运行$redirects数组,然后检查匹配键是否在数组中,在目标上运行上面的referer();函数,然后重定向到它。

// Redirects
$redirects = redir_editkeys($redirects);                    // Edit $redirects keys using editkeys();
if (isset($redirects[$req])) {                              // Check that $redirects[$req] exists
$redir = $redirects[$req];                              // Assign $redir to $redirects[$req];
$redir = referer($redir, $referer, $domain);            // If it does, run referer();
header("Location: $redir");                             // & Redirect
exit();                                                 
}

其次是通配符。我们通过editkeys();函数运行$wildcards数组,在数组上运行foreach();以查找匹配的键,获取匹配后的所有内容作为$wild,仅获取匹配项作为$req,检查数组中作为键存在的$req值,获取该键的目的地,附加$wild, 然后运行检查是否需要引用,重定向和BAM。

// Wildcards
$wildcards = redir_editkeys($wildcards);                    // Edit $wildcards keys using editkeys();
foreach ($wildcards as $key => $value) {                    // Assign variables to $wildcards keys & values
if (strpos($req, $key) !== false) {                     // Using $key, check $req for a match
$wild = substr($req, strlen($key));                 // Extract everything after the match as $wild
$req = substr($req, 0, strlen($key));               // Extract the matching part at the beginning as $req
if (isset($wildcards[$req])) {                      // Check that $wildcards[$req] exists
$redir = $wildcards[$req];                      // Assign $redir to $wildcards[$req]
$redir = $redir.$wild;                          // Attach $wild onto $redir
$redir = referer($redir, $referer, $domain);    // If it does, run referer();
header("Location: $redir");                     // & Redirect
exit();             
}
}
}

然后我们有半通配符,它们或多或少相同。我自己真的没有任何真正的理由,但肯定有原因,例如你已经摆脱了整个投资组合画廊,并希望向该画廊发送请求,并将对图像等的子请求发送回投资组合,这将完成这项工作。所以它是脚本的一部分。

// Half Wilds
$halfwilds = redir_editkeys($halfwilds);                    // Edit $halfwilds keys using editkeys();
foreach ($halfwilds as $key => $value) {                    // Assign variables to $halfwilds keys & values
if (strpos($req, $key) !== false) {                     // Using $key, check $req for a match
$req = substr($req, 0, strlen($key));               // Extract the matching part at the beginning as $req
if (isset($halfcards[$req])) {                      // Check that $halfwilds[$req] exists
$redir = $halfwilds[$req];                      // Assign $redir to $halfwilds[$req]
$redir = referer($redir, $referer, $domain);    // If it does, run referer();
header("Location: $redir");                     // & Redirect
exit();             
}
}
}

我确实想尝试做一个函数来保存这个大量重复的代码,但foreach();非常尴尬。

<小时 />
  1. 404

然后我们有 404 重定向,它将任何请求发送到脚本,这些请求要么与作为 req 参数的请求不匹配,要么在没有 req 参数或为空的情况下仅与引用参数匹配。

// 404
$req = "req=".trim($req,'/')."&";                           // Attach the param name to the $req value for the 404 redirect if it's not empty and remove the slashes.
}   
else { $req = ''; }                                         // If no req param, or if empty, unset $req
header("Location: ".$domain.$_404."?".$req.$referer);       // If there's no match, redirect to this location.
}

这就是脚本。


现在,向脚本发送死请求。

Apache/Litespeed/Openlitespeed (htaccess)


在 htaccess 的底部,添加以下内容:

############# Rewrite dead requests to redirector with uri as query
RewriteCond %{QUERY_STRING} !referer=redirector [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /redirect.php?req=$1 [R=301,L]
#############

恩金克斯


在服务器的(虚拟主机)会议中添加以下内容:

############# Send dead requests to redirector with uri as query
error_page 404 = @redirects;
location @redirects {
if ($query_string !~ referer=redirector {
rewrite ^/(.*)(.php?) /redirect.php?req=$1 redirect;
}
}
#############

我现在正在使用Nginx,远离OpenLitespeed,因为出现了一个奇怪的问题,而Nginx根本没有。所以弄清楚 Nginx conf 做事的方式很有趣。我注意到的一件事是,通过将扩展请求重写为无扩展,发送到您注意到的其他请求.php末尾添加。所以我在这里的重写中排除了扩展名。同样在error_page 404的位置执行这些通配符重定向,比尝试在if中设置以忽略存在的文件/文件夹要容易得多。


删除目标请求上的引用参数。


在尝试用nginx做同样的事情时,我用htaccess做了同样的事情,删除了引用参数,我试图这样做很有趣,我意识到无论如何这是一个有缺陷的解决方案,因为它删除了整个查询。 使用 PHP 代替,这个函数来实现这一点,删除单个参数:

function strip_param($url,$param) {
if (isset($_GET[$param])) {                     // Check that param exists
$base_url = strtok($url,'?');                 // Get the base url
$parsed_url = parse_url($url);                // Parse it
$query = $parsed_url['query'];                // Get the query string
parse_str($query,$params);                    // Convert parameters into array
unset($params[$param]);                       // Delete the one you want
$new_query = http_build_query($params);       // Rebuild query string
$new_url = $base_url.'?'.$new_query;          // Rebuild the url
$url = rtrim($new_url,'?');                   // If now no query, remove ending ?
return header("Location: $url");              // Redirect
} 
}
//  How to use
//
//  Place the above function anywhere you include above content of where you need it, such as a functions file.
//  The below, put this somewhere at the top before content.
// Strip params from requests
strip_param($webpage_URI,'referer');              // The $webpage_URI value is:    "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

这个功能我们可以给这个人提供道具。 这就是导致我开始克隆它被评论的方式的原因。这是一种整洁、可读的做事方式。尽管我之前的剧本很短,但它并不整洁,而且并不完全甜蜜。但是哦,我很高兴现在获得功能。值得推荐!!


再次感谢米克的一些改进技巧。 对 500 个错误有点乐趣,因为当我决定将半通配符命名为$half_wildcards而不是$wildcards_half时,我搞砸了,我没有更新所有这些,哈哈。我现在把它改成$halfwilds,因为我突然想到了它,这是相同数量的字符$wildcards$redirects所以这是甜蜜的一致性。它也使它更加与众不同,这反过来又使事情变得不那么混乱。

这也带来了一个问题,如果有人使用它只是说$wildcards,或$redirects,或者在我的情况下,两者兼而有之,但不是$halfwilds..如果没有重定向,则不会创建关联的数组存在,这将导致 500。所以我创建了空数组,以便它们将始终存在并且不会导致错误。


更新了脚本,稍微移动了数组键变量分配,因此如果您没有将它们设置为忽略未定义的数组和变量等的警告,它们就不会向日志发送垃圾邮件。我现在将这些日志设置为关键,因为它很烦人,但在这里懒惰这个脚本。还编辑了编辑键函数名称,以便在意识到嵌套函数仍然很好地作为全局定义明智地使用它们时redir_editkeys。GRR PHP有它的怪癖。

相关内容

  • 没有找到相关文章

最新更新