PHP-проверяет, существует ли конечный URL
Я знаю, что есть способы проверить, возвращает ли URL-адрес 404 или нет. Я использую следующую функцию, и она работает нормально, но моя проблема заключается в том, что я хочу проверить URL домена, который перенаправляет меня на поддомен в зависимости от языка, используемого моим регионом.
function page_404($url) {
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);
/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
curl_close($handle);
/* If the document has loaded successfully without any redirection or error */
if ($httpCode >= 200 && $httpCode < 300) {
echo $httpCode."<br/>";
return false;
} else {
echo $httpCode."<br/>";
return true;
}
}
Например:
https://example.com/video/123456
Я перенаправлен на следующий URL:
https://es.example.com/video/123456
Что означает, что это http-код "301", и моя функция обнаруживает его как перенаправление и поэтому дает мне ответьте, что видео не существует, но на самом деле оно существует только в том домене, который я перенаправил на этот поддомен.
Если я изменю строку $httpCode Но проблема в том, что эта страница, когда она получает недопустимый url-адрес, перенаправляет меня на свой основной веб-сайт, поэтому я не получаю код 404, и он будет служить мне 301 или 303.
Что я могу сделать? Надеюсь, у меня все получилось.
2 ответа:
Вы можете сказать
cURL
следовать всем перенаправлениям и возвращать результат от окончательного перенаправления. Использование:curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
Вы хотели бы сделать это рекурсивным, так как вы можете перенаправить на страницу, которая перенаправляет на страницу, которая... ну, вы поняли идею. И вы хотите знать, существует ли последняя страница. И вы понятия не имеете заранее, сколько перенаправлений потребуется, чтобы добраться туда.
Вы хотели бы условное после:
if ($httpCode >= 200 && $httpCode < 300) {
Что-то вроде этого:
} elseif ($httpCode >= 301 && $httpCode <= 302) {
(предполагается, что кодами перенаправления являются 301 и 302.. там могут быть и другие, которые я не включаю, поэтому отрегулируйте это соответственно). Затем здесь возьмите URL-адрес, на который вы направляетесь, а затем вызовите саму функцию с этим URL-адресом. Он будет делать это для каждого перенаправления.
Однако, если вы делаете это таким образом, вы можете добавить второй параметр, чтобы вы знали, сколько раз вы вызывали это, что-то вроде:
function page_404($url, $iteration = 1)
Поэтому, когда вы вызываете его позже, вы делаете это следующим образом:
page_404($url, $iteration + 1);
Затем, в самом начале, сделайте проверку, чтобы убедиться, что вы попали в бесконечный редирект:
if($iteration > 10) { echo "Too many redirects"; return (some error); }
Большинство браузеров будут блевать, если они сталкиваются с URL-адресом, который перенаправляет 10 или 15 раз, так что это, вероятно, довольно безопасный номер и безопасное поведение. В противном случае, вы можете закончить перенаправление навсегда, если вы нажмете неверно настроенный URL.