.htaccess Url Переписать Удалить Ключи Строки запроса
У меня есть набор URL-адресов, таких как...
www.example.com/page/1/name/abc
www.example.com/city/la/name/abc
www.example.com/page/1/name/abc/city/la
www.example.com/page/1/
И хотите преобразовать их в..
www.example.com/1/abc
www.example.com/la/abc
www.example.com/1/abc/la
www.example.com/1/
В основном я хочу скрыть ключи из строки запроса.
Как это сделать? Есть какая-нибудь помощь?
Редактировать
У меня разные ключи для каждой страницы, и на каждой странице около 25 ключей.
5 answers
Вы можете использовать Zend_Controller_Router_Route и/или zend_controller_router_route_regex и определить маршруты
$route = new Zend_Controller_Router_Route(
':key/:city_name',
array(
'controller' => 'somecontroller',
'action' => 'pageAction'
),
array('key' => '^\d+$')
);
$router->addRoute('page', $route); // www.example.com/1/abc
$route = new Zend_Controller_Router_Route(
':key/:city_name',
array(
'controller' => 'somecontroller',
'action' => 'cityAction'
),
array('key' => '^\d+\w+$') // www.example.com/1a/abc
);
$router->addRoute('city', $route);
Передний контроллер - это шаблон проектирования, который отображает uri через одну точку, а Zend использует шаблон переднего контроллера. Это отображение может быть изменено на bootstrap.php . Я погуглил и нашел этот вопросn, который очень похож.
Я бы сохранил значение по умолчанию .htaccess
, которое направляет все запросы (за исключением интерфейсных ресурсов, таких как img, css, js и т.д.) в index.php
. Затем добавьте маршруты в начальной загрузке для обработки вашего перенаправления.
Для существующих URL-адресов, которые вы хотите изменить на новые URL-адреса, я бы создал RedirectController
с действиями, которые перенаправляют - действительно перенаправляют, с кодом HTTP 301, а не просто выполняют одно и то же действие - на нужные URL-адреса.
Существует веский аргумент против реализации перенаправлений на уровень приложения через маршруты по сравнению с его обработкой .htaccess
: он будет менее производительным, поскольку для выполнения перенаправления требуется весь цикл начальной загрузки/отправки. Это справедливый аргумент, но я нахожу более ясным, чтобы вся моя информация о маршруте находилась в одном месте, а не разделялась как на .htaccess
, так и на маршрутах на уровне приложения.
Попробуйте это
<IfModule mod_rewrite.c>
RewriteEngine on
#1 www.example.com/1/abc to www.example.com/page/1/name/abc (/number/string)
RewriteRule ^([0-9]+)/([^/]+)$ /page/$1/name/$2 [L,QSA]
#2 www.example.com/la/abc to www.example.com/city/la/name/abc (/string/string)
RewriteRule ^([^/]+)/([^/]+)$ /city/$1/name/$2 [L,QSA]
#3 www.example.com/1/abc/la to www.example.com/page/1/name/abc/city/la (/number/string/string)
RewriteRule ^([0-9]+)/([^/]+)/([^/]+)$ /page/$1/name/$2/city/$3 [L,QSA]
#4 www.example.com/1/ to www.example.com/page/1/ (/number/)
RewriteRule ^([0-9]+)/$ /page/$1/ [L,QSA]
</IfModule>
Порядок правил очень важен. Не меняйся. Правило 1 всегда должно быть перед правилом 2. Правило 4 всегда должно быть последним. Порядок - от самого специфического до самого общего правила. Правило 3 может находиться в любом положении, но перед правилом 4.
- Попробуйте унифицировать свой URL-адрес. Тогда с ним будет легче работать. Вот практический пример.
. htaccess файл:
RewriteEngine on
# Remove trailing '/' from URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+[^/])/$
RewriteRule ^(.*)/$ /$1 [R=301,L]
# Convert url to ?q=/US/en/0001
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule ^(.*)$ index.php?q=%1 [NS,L]
# Input: /US/en/0001
# Output print_r($_GET);
# Array
# (
# [country] => US
# [locale] => en
# [pid] => 0001
# )
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})/([0-9a-zA-Z]{4})$
RewriteRule ^(.*)$ ?country=%1&locale=%2&pid=%3 [NS,L]
# Input: /US/en
# Output print_r($_GET);
# Array
# (
# [country] => US
# [locale] => en
# )
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})$
RewriteRule ^(.*)$ ?country=%1&locale=%2 [NS,L]
# Input: /US
# Output print_r($_GET);
# Array
# (
# [country] => US
# )
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})$
RewriteRule ^(.*)$ ?country=%1 [NS,L]
Index.php
<?php
print_r($_GET);
?>