Как преобразовать строку запроса в URI сегмента?

Я пытаюсь преобразовать строку запроса;

http://atwd/books/course?course_id=CC100&format=XML&submit=Submit 

В сегмент URI;

 http://atwd/books/course/CC100/XML 

Я работаю в CodeIgniter.

Я смотрел на ответ stackoverflow, который сказал, чтобы проверить руководство сегмента URL CodeIgniter, но я не думаю, что есть какая-либо информация о том, как преобразовать строку запроса в сегментный URI. Существует, однако, способ преобразования сегмента URI сегмента в строку запроса, которая также повышает нагрузку на результаты Google.

Следуя другому ответу stackoverflow , я попробовал это в моем файле .htaccess, но ничего не работало

 RewriteCond %{QUERY_STRING} ^course_id\=([^&]+)\&format\=([^&]+)$ RewriteRule ^$ /course/%1/format/%2 [R,L] 

В моем файле .htaccess у меня есть это;

 <IfModule mod_rewrite.c> RewriteEngine on #Source: http://codeigniter.com/user_guide/general/urls.html #Removal of index.php RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRule ^(.*)$ /index.php?route/$1 [L] #Source: https://stackoverflow.com/questions/3420204/htaccess-get-url-to-uri-segments #Format Course function requests RewriteBase / RewriteCond %{QUERY_STRING} ^course_id\=([^&]+)\&format\=([^&]+)$ RewriteRule ^$ /course/%1/format/%2 [R,L] </IfModule> 

Это в моем корневом каталоге скриншота Codeigniter

Мой код в файле .htaccess не работает, я обновляю страницу и ничего не происходит. Тем не менее работает код для скрытия index.php. Кто-нибудь знает, почему?

Solutions Collecting From Web of "Как преобразовать строку запроса в URI сегмента?"

Понятие «преобразование URL-адресов» из одной вещи в другую полностью неоднозначно, см. Верхнюю часть этого ответа для объяснения того, что происходит с URL-адресами при перенаправлении или перезаписи: https://stackoverflow.com/a/11711948/851273

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


Когда вы вводите http://atwd/books/course?course_id=CC100&format=XML&submit=Submit в свой браузер, это URI запроса, который отправляется через mod_rewrite: /books/course . В вашем правиле вы сопоставляетесь с пустым URI: RewriteRule ^$ /course/%1/format/%2 [R,L] . Это первая причина, по которой ваше правило не работает. Вторая причина, почему это не работает, заключается в том, что выше всего, все, кроме изображений и index.php и robots.txt, маршрутизируется через index.php. Таким образом, даже если вы были сопоставлены с правильным URI, он маршрутизируется до того, как ваше правило даже сделает что-нибудь.

Вы должны скорректировать шаблон в своем правиле, чтобы он соответствовал URI, который вы планируете перенаправить, и вам нужно поместить это правило до того правила, которое у вас есть. Итак, все должно выглядеть примерно так:

 <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{QUERY_STRING} ^course_id\=([^&]+)\&format\=([^&]+)$ RewriteRule ^/?books/course$ /course/%1/format/%2 [R,L] #Source: http://codeigniter.com/user_guide/general/urls.html #Removal of index.php RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRule ^(.*)$ /index.php?route/$1 [L] </IfModule> 

Вам нужно будет настроить пути, чтобы убедиться, что они соответствуют тому, что вы на самом деле ищете.


Чтобы перенаправить браузер и внутренне переписать обратно на исходный URL-адрес, вам нужно сделать что-то другое.

Во-первых, вы должны убедиться, что все ваши ссылки выглядят так: /course/CC100/format/XML . Измените свою CMS или статический HTML, чтобы все ссылки отображались именно так.

Затем вам нужно изменить правила (все до вашего правила правильности кода), чтобы быть чем-то вроде этого:

 <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / # redirect browser to a URI without the query string RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /books/course/?\?course_id=([^&]+)&format=([^&]+) RewriteRule ^/?books/course$ /course/%2/format/%3? [R,L] # internally rewrite query string-less request back to one with query strings RewriteRule ^/?course/([^/]+)/format/([^/]+)$ /books/course?course_id=$1&format=$2&submit=Submit [L] #Source: http://codeigniter.com/user_guide/general/urls.html #Removal of index.php RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRule ^(.*)$ /index.php?route/$1 [L] </IfModule> 

Я не собираюсь рассматривать недоразумения, которые уже были рассмотрены довольно хорошо в другом ответе и комментариях, и я не могу говорить специально для CodeIgniter, но, быстро указав свои протоколы маршрутизации URL-адресов , он кажется очень похожим на большинство веб-фреймворков:


Вероятно, вы просто хотите направить весь трафик (который не соответствует физическим файлам) на веб-контроллер frontend (index.php) и обрабатывать URL-адреса в маршрутизации CodeIgniter, а не в файле htaccess.

Для этого ваш htaccess может быть таким простым, как:

 <IfModule mod_rewrite.c> RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* index.php [QSA,L] </IfModule> 

Это, как я уже сказал, перенаправит любой трафик, который не соответствует физическому файлу, например robots.txt или изображению, на ваш index.php.

Затем, используя маршрутизацию, как описано в документах ( http://ellislab.com/codeigniter/user-guide/general/routing.html ), вы можете взять параметры и передать их своим контроллерам по своему усмотрению, нет нужно «конвертировать» или «отображать» что угодно, ваш URL не нужно разрешать /?yada=yada внутренне, на основе ваших правил маршрутизации CodeIgniter может это решить.

Вам нужны такие подстановочные маршруты, как это из документов:

 $route['product/:id'] = "catalog/product_lookup"; 

Грубый пример того, что ваш может выглядеть таким образом, будет примерно таким:

 $route['course/:id/format/:format'] = "course/something_or_other_action"; 

Если я правильно понимаю вас, вы можете передумать. У меня есть что-то подобное в моем собственном коде.

У меня есть контроллер с именем Source. В этом контроллере у меня есть следующий метод:

 public function edit($source_id, $year) { # Code relevant to this method here } 

Это дает: http://localhost/source/edit/12/2013 $source_id , где 12 относится к $source_id а 2013 относится к $year . Каждый добавленный параметр автоматически преобразуется в собственный сегмент URI. Он также не требовал обмана .htaccess или настраиваемых маршрутов.