Я строю небольшую систему CMS в Zend Framework 2. Мой новый веб-сайт будет иметь новую структуру URL, и я хотел бы создать 303 обработчик ошибок.
Идеальное решение:
Пользователь или поисковая система посетят веб-сайт по старому URL, если страница не была найдена, и проверит список старых URL, сохраненных в (db или array), если URL найден, это создаст редирект 303. Если URL не был найден в списке, он должен создать страницу 404.
Пример URL:
старый (не выходящий) URL: www.example.com/category/product123.html этот адрес следует перенаправить на новый URL: www.example.com/category/product-name/
Всего у меня будет более 100 старых страниц, которые нужно перенаправить на новый URL.
Как я должен сделать это правильно?
HTTP 303 является настраиваемым заголовком перенаправления, не является ошибкой и должен использоваться после HTTP POST. Если вы хотите сохранить некоторые устаревшие URL-адреса (для целей SEO и т. Д.), Вы можете использовать HTTP 301 — перемещен навсегда заголовок.
Существует несколько способов перенаправить любой HTTP-запрос на любой другой ресурс в обоих Http-сервер а также приложение уровень. Я бы предпочел уровень nginx / apache. Пример для nginx:
server {
# ...
location ~ "^/category/([a-zA-Z0-9]+).html" {
# Example: http://www.example.com/category/product123.html
# The $1 will be product123
return 303 http://www.example.com/category/$1;
}
# ...
}
Теперь зову старый /category/product123.html
URL после перезагрузки конфигурации вашего http-сервера выдаст ответ, подобный следующему:
HTTP/1.1 303 See Other
Server: nginx/1.X.0
Date: Tue, 07 Oct 2014 20:47:29 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 168
Connection: keep-alive
Location: http://www.example.com/category/prodct123
На уровне приложения вы можете легко перенаправить запросы внутри любого действия контроллера, возвращаемого действительным отклик объект:
public function anyControllerAction()
{
$response = $this->getResponse();
$response->getHeaders()->addHeaderLine('Location', 'http://www.example.com/category/prodct123');
$response->setStatusCode(303);
return $response;
}
Надеюсь, поможет.
Других решений пока нет …