Как переписать SEO дружественный URL, как stackoverflow - PullRequest
4 голосов
/ 07 февраля 2012

Если вы перейдете по ссылке, подобной следующей: /6474287/perenapravit-suschestvuyschii-fail-na-drugoi-url-ispolzuya-modrewrite адресная строка будет обновлена ​​до /6474287/perenapravit-suschestvuyschii-fail-na-drugoi-url-ispolzuya-modrewrite. Это не делается с помощью JavaScript и не требует жесткого обновления, я думаю, что это сделано с помощью mod_rewrite; однако как он узнает заголовок статьи без обработки на стороне сервера с помощью php?

Я только что обновил свой сайт, чтобы использовать оптимизированные для SEO URL-адреса, раньше он был /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.

Ответы [ 5 ]

2 голосов
/ 07 февраля 2012

если я делаю

curl -I /6474287/perenapravit-suschestvuyschii-fail-na-drugoi-url-ispolzuya-modrewrite

, я фактически получаю жесткое перенаправление:

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.

2 голосов
/ 07 февраля 2012

для дублированного контента у вас должен быть тег канонической ссылки в голове.тег канонической ссылки сообщит Google, что текущая страница имеет альтернативный URL для того же контента, что и каноническая ссылка, а основным URL для этого контента является каноническая ссылка.это отлично подходит для таких вещей, как постраничный контент, поиски и т. д., когда одна и та же страница может иметь разные URL.

<link rel="canonical" href="http://www.somedomain.com/mainurl" />
2 голосов
/ 07 февраля 2012

Я также создал SEO-дружественное решение для 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];
}

Это также позволяет вам продолжать принимать существующие ссылки без необходимости иметь 2 версии одного и того же кода.

2 голосов
/ 07 февраля 2012

как бы он знал название статьи без обработки на стороне сервера с помощью 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, а затем перенаправьте.

0 голосов
/ 07 февраля 2012

Вам нужно либо сделать это в самом приложении, сверяя URL-адрес с абсолютным URL-адресом для запрошенного местоположения, либо генерируя отображение каждый раз, когда добавляется новая «страница».

...