$curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
- if ($curlResponse->isRedirectUrl()) {
+ if (!Network::isRedirectBlocked($url) && $curlResponse->isRedirectUrl()) {
$redirects++;
$this->logger->notice('Curl redirect.', ['url' => $url, 'to' => $curlResponse->getRedirectUrl()]);
@curl_close($ch);
$curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
- if ($curlResponse->isRedirectUrl()) {
+ if (!Network::isRedirectBlocked($url) && $curlResponse->isRedirectUrl()) {
$redirects++;
$this->logger->info('Post redirect.', ['url' => $url, 'to' => $curlResponse->getRedirectUrl()]);
curl_close($ch);
return $url;
}
+ if (Network::isRedirectBlocked($url)) {
+ $this->logger->info('Domain should not be redirected.', ['url' => $url]);
+ return $url;
+ }
+
$url = Network::stripTrackingQueryParams($url);
if ($depth > 10) {
DB_UPDATE_VERSION . '; ' .
$this->baseUrl;
}
+
+ private function redirectBlocked(string $url = null)
+ {
+ $hosts = $this->config->get('system', 'no_redirect_hosts');
+ if (empty($hosts)) {
+ return false;
+ }
+
+ $hostlist = explode(',', $hosts);
+ }
}
$orig_plink = $item["plink"];
+ $item["plink"] = DI::httpRequest()->finalUrl($item["plink"]);
+
$item["parent-uri"] = $item["uri"];
$item["title"] = XML::getFirstNodeValue($xpath, 'atom:title/text()', $entry);
return false;
}
+ /**
+ * Checks if the provided url is on the list of domains where redirects are blocked.
+ * Returns true if it is or malformed URL, false if not.
+ *
+ * @param string $url The url to check the domain from
+ *
+ * @return boolean
+ */
+ public static function isRedirectBlocked(string $url)
+ {
+ $host = @parse_url($url, PHP_URL_HOST);
+ if (!$host) {
+ return false;
+ }
+
+ $no_redirect_list = DI::config()->get('system', 'no_redirect_list', []);
+ if (!$no_redirect_list) {
+ return false;
+ }
+
+ foreach ($no_redirect_list as $no_redirect) {
+ if (fnmatch(strtolower($no_redirect), strtolower($host))) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
/**
* Check if email address is allowed to register here.
*
// Don't use OEmbed to fetch more information about a link.
'no_oembed' => false,
+ // no_redirect_list (Array)
+ // List of domains where HTTP redirects should be ignored.
+ 'no_redirect_list' => [],
+
// no_smilies (Boolean)
// Don't show smilies.
'no_smilies' => false,