Я пытаюсь преобразовать строку запроса;
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. Кто-нибудь знает, почему?
Понятие «преобразование 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 или настраиваемых маршрутов.