PHP .htaccess -> довольно URL (в обратном порядке) - PullRequest
5 голосов
/ 07 апреля 2011

Я знаю, как сделать перезапись URL, например: www.example.com/index.php?id=1&cat=3 до www.example.com/1/3/ (или что-то еще).Я знаю это.

Чего я не знаю, так это как изменить все мои ссылки на всех страницах, чтобы они ссылались на красивые URL.Все ссылки на моем сайте устарели (<a href="index.php?id=1&cat=2">), и их много.

Я спрашиваю, есть ли у кого-нибудь идея или знаете, как автоматически перенаправить на этот красивый URL-адрес, если пользователь нажмет index.php? ID = 1.(Почти как этот сайт Stackoverflow, если вы измените заголовок в URL).

Итак, мои предположения ...

  1. Использовать .htaccess для чтения index.php?id = 1 & cat = 2 для перезаписи index / 1/3, который сам интерпретирует снова (странно)

  2. файл php для перенаправления, которое htaccess перезаписывает обратно в исходное ...

Вывод: изменить <a href="index.php?id=1&....."> автоматически на index/1/2


РЕШЕНО

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

##################################
# This turns index.php?id=1&cat=2 into index/1/2 and then back 'transparent' into    index.php?id=1&cat=2 if you have old fashioned
# links in your site and don't want to change them :)


# Avoid mod_rewrite infinite loops 
# This is critical if you want to use this code

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
#   and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index.php$ http://localhost/index/%1/%2/? [L,R]

# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
# Won't re-trigger the above rewrite, though I'm
#   not really sure why! The order of the rules
#   doesn't seem to make a difference.
RewriteRule ^index/(\d+)/(\d+)/$ index.php?id=$1&cat=$2 [L]

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011
RewriteEngine on

# Prevents browser looping, which does seem
#   to occur in some specific scenarios. Can't
#   explain the mechanics of this problem in
#   detail, but there we go.
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
#   and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index\.php$ http://example.com/index/%1/%2/? [L,R]

# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2

Конечно, в идеале вы просто исправили бы свои ссылки, а затем вам потребовалось бы только мягкое переписывание. :)

Протестировано с Apache / 2.2.3. Я думаю, что я придумал термины «жесткая перезапись» и «мягкая перезапись».

0 голосов
/ 07 апреля 2011

Почему бы просто не изменить файл index.php, чтобы сделать это? Таким образом, теоретически вы могли бы сделать еще большую проверку ошибок, позволяя переменным располагаться в любом порядке и при этом перенаправляться в правильное конечное местоположение.

<?php
    // Permanent redirection
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://www.example.com/{$_GET['id']}/{$_GET['cat']}");

Я не проверял здесь ошибки, но хотел привести базовый пример.

Если подумать, я полагаю, что это добавляет функциональность к файлу index.php, который вы затем хотите использовать для самого приложения, так что, возможно, это приведет к путанице в функциональности кода.

...