Если вы перейдете к URL-адресу, например: http://stackoverflow.com/questions/9155602/
адресная строка будет обновлена до http://stackoverflow.com/questions/9155602/redirect-existing-file-to-different-url-using-mod-rewrite
. Это не делается с JavaScript, а не с жестким обновлением, я думаю, что это делается с помощью mod_rewrite; однако, как он узнает название статьи без обработки на стороне сервера с помощью php?
Я только что обновил свой сайт, чтобы использовать дружественный URL-адрес SEO, он был /shows.php?id=review-1
а теперь он /review/1/super-baseball-2020
. Текст в конце на самом деле не имеет особого значения, когда дело доходит до моего переписывания:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-z0-9]+)/([0-9]+)/([a-z0-9-]+)?/?$ /shows.php?id=$1-$2 [L,NC]
Мой текущий путь к тому, чтобы Google не ударил меня по дублированному контенту и что закладки пересылаются правильно:
RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? RewriteCond %{QUERY_STRING} (?:^|&)id=review-1(?:&|$) [NC] RewriteRule ^ /review/1/super-baseball-2020/? [R=301,L,NC] RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? RewriteCond %{QUERY_STRING} (?:^|&)id=review-2(?:&|$) [NC] RewriteRule ^ /review/2/aero-fighters-2/? [R=301,L,NC] RewriteCond %{THE_REQUEST} ^GET\s/shows\.php\? RewriteCond %{QUERY_STRING} (?:^|&)id=review-3(?:&|$) [NC] RewriteRule ^ /review/3/aero-fighters-3/? [R=301,L,NC] .... and so on ....
Это решение очень близоруко, и тысячи строк помещаются в мой .htaccess.
как он узнает название статьи без обработки на стороне сервера с помощью php?
mod_rewrite
может делать только многое. Кроме того, вам придется обновить его слишком много. Лучше обрабатывать эти запросы с помощью скриптов. Создайте .htaccess
, аналогично тому, что вы сделали:
<IfModule mod_rewrite.c> RewriteEngine On #RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php [QSA,L] </IfModule>
Затем в вашем index.php
разделите REQUEST_URI
на разбор /review/1/
, посмотрите в базе данных заголовок обзора с id
1, передайте его в свою дружественную функцию URI (slug) и добавьте его в url, затем перенаправить.
для дублированного контента у вас должен быть канонический тег ссылки в голове. канонический тег ссылки скажет google, что текущая страница имеет альтернативный URL-адрес для того же содержимого, что и каноническая ссылка, а основным URL для этого контента является каноническая ссылка. это отлично подходит для таких вещей, как разбитый на страницы контент, поиск, ect, где одна и та же страница может иметь разные URL-адреса.
<link rel="canonical" href="http://www.somedomain.com/mainurl" />
Я также создал SEO-friendly URL-решение для нашего шоу. URL-адрес естественно /raido/episode.php?SeriesId=1&EpisodeId=123, но я тоже хотел /radio/1-123-live.htm, поэтому мой .htaccess выглядит так:
RewriteRule ^ \ d {1,3} – \ d {1,4} (. +). Html $ episode.php? Slug = $ 0
Затем я разрешаю странице назначения обрабатывать ее
if ($Slug !== "") { $lIds = explode("-", $Slug); $SeriesId=$lId[0]; $EpisodeId=$lIds[1]; }
Это также позволяет вам продолжать принимать существующие ссылки, не имея двух версий одного и того же кода.
если я сделаю
curl -I http://stackoverflow.com/questions/9155602/
я действительно получаю жесткую переадресацию:
HTTP/1.1 301 Moved Permanently Cache-Control: public, max-age=60 Content-Length: 0 Content-Type: text/html Expires: Mon, 06 Feb 2012 22:43:27 GMT Last-Modified: Mon, 06 Feb 2012 22:42:27 GMT Location: /questions/9155602/redirect-existing-file-to-different-url-using-mod-rewrite Vary: * Date: Mon, 06 Feb 2012 22:42:27 GMT
часто эти настройки содержат короткий .htaccess, заставляя все запросы проходить через передний контроллер или основной файл index.php. этот файл проверяет переменную $ _SERVER ['PATH_INFO'] и решает, какой контент втянуть и отобразить.
это простой пример .htaccess (на самом деле просто скопирован с установки ванильного WordPress):
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
в этом примере с жесткой переадресацией они могут иметь «else» в index.php, делая поиск и перенаправлять правильно, если контент не найден на основе последнего фрагмента PATH_INFO.
Вам нужно либо сделать это в самом приложении, проверив URL-адрес против абсолютного URL-адреса для запрашиваемого местоположения, либо генерируя отображение каждый раз, когда добавляется новая «страница».