Я знаю, как переписать 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-адресе).
Поэтому мои презумпции …
Используйте .htaccess, чтобы прочитать index.php? Id = 1 & cat = 2, чтобы переписать индекс / 1/3, который сам снова интерпретирует (странно)
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]
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. Я думаю, что я составил термины «hard-rewrite» и «soft-rewrite».
Почему бы просто не изменить файл index.php для этого? Теоретически вы могли бы сделать еще немного проверки ошибок таким образом, позволяя переменным быть в любом порядке и все же перенаправляться в правильное конечное местоположение.
<?php // Permanent redirection header("HTTP/1.1 301 Moved Permanently"); header("Location: http://www.example.com/{$_GET['id']}/{$_GET['cat']}");
Я не делал никаких ошибок здесь, но хотел дать базовый пример.
С другой стороны, я предполагаю, что это добавление функциональности в файл index.php, который вы затем хотите использовать для своего приложения, поэтому, возможно, это приведет к запутыванию функциональности кода.