Перенаправление на определенные страницы в зависимости от маршрутизации URL с использованием файла htaccess - PullRequest
0 голосов
/ 13 февраля 2011

У меня есть URL, как

http://localhost/mis  
http://localhost/mis/newsletter.php  
http://localhost/mis/cms.php?mainid=65  
http://localhost/mis/news.php?mainid=93

Ну, я использую эти URL для школы секции.

Теперь для секции A-level у меня есть следующие URL

http://localhost/mis/index.php?mode=0  
http://localhost/mis/newsletter.php?mode=0  
http://localhost/mis/cms.php?mainid=65&mode=0  
http://localhost/mis/news.php?mainid=93&mode=0

Я хочу, чтобы вышеприведенные URL были перенаправлены как

http://localhost/mis/a-level  
http://localhost/mis/a-level/newsletter.php  
http://localhost/mis/a-level/cms.php?mainid=65  
http://localhost/mis/a-level/news.php?mainid=93

Пожалуйста, помогите мне с маршрутизацией URL через файл .htaccess.

РЕДАКТИРОВАТЬ: Файл htaccess находится в папке mis

СТРУКТУРА ФАЙЛА:

root>>
    mis>>
        .htaccess
        newsletter.php
        cms.php
        news.php

Ответы [ 6 ]

5 голосов
/ 10 марта 2011

Попробуйте это в файле .htaccess внутри папки /mis.

# turning rewrite on
RewriteEngine On

# this will redirect: mis/a-level
RewriteRule ^a-level$ index.php?mode=0 [L]

# this will redirect all the rest
RewriteRule ^a-level/(.+)$ $1?mode=0 [QSA,L]

Я думаю, что строки типа http://localhost/mis/cms.php?mainid=65&mode=0 являются просто ошибками копирования-вставки, и вы делаете следующее:http://localhost/mis/cms.php?mainid=65&mode=0

Я проверил эти правила.Если они не работают в вашей системе, должна быть проблема с конфигурацией.Есть ли в вашем файле другие правила перезаписи?Я не, попробуйте включить переписывание журнала, чтобы получить больше информации.Это необходимо включить в httpd.conf (они не разрешены в .htaccess ).

RewriteLog D:\bence\wamp\logs\rewrite.log
RewriteLogLevel 3

Мой журнал перезаписи для URL http://proba.test/mis/a-level/news.php?some=thing&other=33

127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] add path info postfix: D:/bence/www/proba.test/mis/a-level -> D:/bence/www/proba.test/mis/a-level/news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/a-level/news.php -> a-level/news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level$' to uri 'a-level/news.php'
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] add path info postfix: D:/bence/www/proba.test/mis/a-level -> D:/bence/www/proba.test/mis/a-level/news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/a-level/news.php -> a-level/news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level/(.+)$' to uri 'a-level/news.php'
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (2) [perdir D:/bence/www/proba.test/mis/] rewrite 'a-level/news.php' -> 'news.php?mode=0'
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) split uri=news.php?mode=0 -> uri=news.php, args=mode=0&some=thing&other=33
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (3) [perdir D:/bence/www/proba.test/mis/] add per-dir prefix: news.php -> D:/bence/www/proba.test/mis/news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (2) [perdir D:/bence/www/proba.test/mis/] strip document_root prefix: D:/bence/www/proba.test/mis/news.php -> /mis/news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#f67a88/initial] (1) [perdir D:/bence/www/proba.test/mis/] internal redirect with /mis/news.php [INTERNAL REDIRECT]
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#253ab08/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/news.php -> news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#253ab08/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level$' to uri 'news.php'
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#253ab08/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/news.php -> news.php
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#253ab08/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level/(.+)$' to uri 'news.php'
127.0.0.1 - - [11/Mar/2011:11:36:03 +0100] [proba.test/sid#713440][rid#253ab08/initial/redir#1] (1) [perdir D:/bence/www/proba.test/mis/] pass through D:/bence/www/proba.test/mis/news.php

И журнал для: http://proba.test/mis/a-level

127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/a-level -> a-level
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level$' to uri 'a-level'
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (2) [perdir D:/bence/www/proba.test/mis/] rewrite 'a-level' -> 'index.php?mode=0'
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (3) split uri=index.php?mode=0 -> uri=index.php, args=mode=0
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (3) [perdir D:/bence/www/proba.test/mis/] add per-dir prefix: index.php -> D:/bence/www/proba.test/mis/index.php
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (2) [perdir D:/bence/www/proba.test/mis/] strip document_root prefix: D:/bence/www/proba.test/mis/index.php -> /mis/index.php
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#25f6338/initial] (1) [perdir D:/bence/www/proba.test/mis/] internal redirect with /mis/index.php [INTERNAL REDIRECT]
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#260c1d0/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/index.php -> index.php
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#260c1d0/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level$' to uri 'index.php'
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#260c1d0/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] strip per-dir prefix: D:/bence/www/proba.test/mis/index.php -> index.php
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#260c1d0/initial/redir#1] (3) [perdir D:/bence/www/proba.test/mis/] applying pattern '^a-level/(.+)$' to uri 'index.php'
127.0.0.1 - - [11/Mar/2011:11:39:29 +0100] [proba.test/sid#713440][rid#260c1d0/initial/redir#1] (1) [perdir D:/bence/www/proba.test/mis/] pass through D:/bence/www/proba.test/mis/index.php
0 голосов
/ 10 марта 2011

Я думаю, что вы смотрите на это неправильно - ваша главная проблема - преобразовать то, что нужно PHP-коду, во что-то описательное для URL, а не пытаться выполнить это с помощью mod_rewrite, я предлагаю вам пересмотреть свой подход.

Использование mode = 0 бессмысленно в коде и не очевидно для всех, кто читает код относительно того, что он делает. Я предлагаю изменить код для принятия mode = a-level. это значительно упростит ваше правило mod_rewrite, а также значительно облегчит чтение кода.

0 голосов
/ 09 марта 2011
RewriteEngine On
RewriteCond %{query_string} mode=0
RewriteRule mis/(.+?\.php)$ mis/a-level/$1 [QSA,L]
0 голосов
/ 08 марта 2011
RewriteEngine On

RewriteRule ^a-level$ a-level/
RewriteRule a-level/(.*)$ $1?mode=0 [QSA]

Первое правило действует как поддержка второго, так как второе правило требует косой черты.Вы также можете добавить [R=301,L] к первому правилу, чтобы перенаправить пользователя на версию с косой чертой.(Для реальных, настоящих папок Apache сделает это автоматически, так как это не «настоящая» папка, вам придется делать это самостоятельно.)

Второе правило просто лишит уровень aчасть URL.Однако секретный соус, который делает это блюдо таким низкокалорийным, является частью QSA.QSA означает добавление строки запроса.Он просто заклинивает любую существующую строку запроса до конца URL.

Это дает дополнительное преимущество, так как вы не делаете никаких предположений относительно содержания QS.Если вам когда-нибудь понадобится добавить другую переменную запроса, кроме mainid, вам не нужно изменять правило.

Редактировать: Или, например, если файл htaccess находится в корневом веб-каталоге.1009 *

RewriteRule ^mis/a-level$ mis/a-level/
RewriteRule mis/a-level/(.*)$ /mis/$1?mode=0 [QSA]
0 голосов
/ 06 марта 2011

Понял ...

RewriteCond %{QUERY_STRING} ^(.*)mode(.*)$
RewriteRule mis/(.*) /mis/a-level/$1?%1 [R]

Архитектура для справки:

/root/
    .htaccess
    /mis/
        /a-level/
            newsletter.php
            cms.php
            news.php

localhost/mis/newsletter.php?mainid=65&mode=0

теперь перенаправляет на

localhost/mis/a-level/cms.php?mainid=65 - - (MODE BE GONE): -)

Не требуется php для удаления параметров / значений. Довольно хитрый трюк, если вы можете держать под контролем свои Cond / Rules и RegEx. (примечание: почти идентичное Cond / Rule, возможно, должно идти прямо перед этим решением, чтобы перехватить файл index.php)

Вы также можете изменить параметр / значения:

RewriteRule mis/(.*) /mis/a-level/$1?blue=9 [R]

Была некоторая помощь http://wiki.apache.org/httpd/RewriteQueryString

0 голосов
/ 13 февраля 2011

Не тестировал его на живом сервере, но http://www.regextester.com/ показывает эти выходные данные, которые вам нужны

Options +FollowSymLinks
RewriteEngine on

RewriteRule a-level/(.*)\.php\?mainid=(.*)$ /mis/$1.php?mainid=$2&mode=0
RewriteRule a-level/(.*)\.php$ /mis/$1.php?mode=0
RewriteRule a-level$ /mis/index.php?mode=0
...