.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 ключей.

Author: Ashwini Agarwal, 2012-09-03

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);
 4
Author: Maks3w, 2012-09-10 16:41:40

Передний контроллер - это шаблон проектирования, который отображает uri через одну точку, а Zend использует шаблон переднего контроллера. Это отображение может быть изменено на bootstrap.php . Я погуглил и нашел этот вопросn, который очень похож.

 2
Author: Ruwantha, 2017-05-23 12:27:36

Я бы сохранил значение по умолчанию .htaccess, которое направляет все запросы (за исключением интерфейсных ресурсов, таких как img, css, js и т.д.) в index.php. Затем добавьте маршруты в начальной загрузке для обработки вашего перенаправления.

Для существующих URL-адресов, которые вы хотите изменить на новые URL-адреса, я бы создал RedirectController с действиями, которые перенаправляют - действительно перенаправляют, с кодом HTTP 301, а не просто выполняют одно и то же действие - на нужные URL-адреса.

Существует веский аргумент против реализации перенаправлений на уровень приложения через маршруты по сравнению с его обработкой .htaccess: он будет менее производительным, поскольку для выполнения перенаправления требуется весь цикл начальной загрузки/отправки. Это справедливый аргумент, но я нахожу более ясным, чтобы вся моя информация о маршруте находилась в одном месте, а не разделялась как на .htaccess, так и на маршрутах на уровне приложения.

 2
Author: David Weinraub, 2012-09-08 06:25:14

Попробуйте это

<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.

 2
Author: mabarroso, 2012-09-12 17:36:35
  1. Попробуйте унифицировать свой 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);
?>
 0
Author: ejohansson, 2012-09-14 19:23:33