Как можно выдать ошибку 410 для страницы, если в URL есть знак вопроса?

Здравствуйте! <br/> <br/> У меня есть задача, в рамках которой требуется присвоить ошибку 410 определённым ссылкам, если в их середине присутствует знак вопроса. Вот список ссылок: <br/> <pre><code>https://mysite.com/ru?khl-service=
https://mysite.com/en?gdf-service=
https://mysite.com/es-mx?opl-service=</code></pre> <br/> <br/> Я создал следующее условия: <br/> <pre><code class="php">use Illuminate\Support\Str;

if (Str::contains(request()-&gt;getRequestUri(), '?')) {
 header("HTTP/1.1 410 Gone");// Сообщаем браузеру, что страница удалена по коду 410 Gone
 exit;		
}</code></pre> <br/> Однако, это условие не работает. <br/> <br/> Можете подсказать, в чём ошибка и как правильно реализовать данную логику?
  • 25 октября 2024 г. 22:22
Ответы на вопрос 2
В вашем коде ваша логика на первый взгляд выглядит правильно, но есть несколько моментов, которые стоит проверить и учесть при реализации, чтобы всё работало корректно. 

1. **Проверка URL**: Убедитесь, что вы используете правильный метод для получения URI. Если вы используете Laravel, вы можете использовать метод `request()->getRequestUri()`, как вы и сделали. Однако, если у вас какие-то специфические настройки веб-сервера или приложения, убедитесь, что этот метод возвращает ожидаемое значение.

2. **Добавление проверки на статусы**: Если вы хотите, чтобы определённые URL выдавали ошибку 410, убедитесь, что они действительно содержатся в вашем условии. Например:
   
   ```php
   use Illuminate\Support\Str;

   $uri = request()->getRequestUri();

   $urlsToCheck = [
       '/ru?khl-service=',
       '/en?gdf-service=',
       '/es-mx?opl-service='
   ];

   // Проверяем, имеется ли знак вопроса и соответствует ли URL какому-то из заданных
   foreach ($urlsToCheck as $url) {
       if (Str::contains($uri, $url)) {
           header("HTTP/1.1 410 Gone");
           exit;
       }
   }
   ```

3. **Проверка на конфигурацию веб-сервера**: Если вы используете веб-сервер, например Apache или Nginx, убедитесь, что у вас настроены правила и конфигурация, которые не мешают обработке PHP. Возможно, у вас стоит правило переадресации или что-то другое, что может влиять на это.

4. **Отладка**: Добавьте `var_dump()` или `error_log()` одну или несколько проверок из примера выше, чтобы убедиться, что код действительно исполняется и условие срабатывает.

5. **Порядок выполнения**: Убедитесь, что ваш код с проверкой на `410 Gone` запускается до того, как выводится какой-либо контент страницы. Если есть какой-либо вывод перед тем, как вы устанавливаете заголовок, проблема может возникнуть из-за того, что заголовки уже были отправлены.

Вот более полный пример:

```php
use Illuminate\Support\Str;

// Получаем текущий URL
$uri = request()->getRequestUri();

// Список URL, для которых нужно вернуть 410
$urlsToCheck = [
    '/ru?khl-service=',
    '/en?gdf-service=',
    '/es-mx?opl-service='
];

// Проверяем наличие знака вопроса и соответствие URL
foreach ($urlsToCheck as $url) {
    if (Str::contains($uri, $url)) {
        header("HTTP/1.1 410 Gone");
        exit;
    }
}
```

Следуя этим шагам и рекомендациям, вы сможете корректно настроить выдачу ошибки 410 для нужных вам страниц.
Где условие то разместили? 
Вообще то должно работать, только "exit" не надо делать в Laravel.

Правильнее будет через Middleware
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\Response;

class UriIsGone
{
    public function handle(Request $request, Closure $next): Response
    {
        if (Str::contains(request()->getRequestUri(), '?')) {
            return \response("Gone error", 410);
        }
        return $next($request);
    }
}
Похожие вопросы