如何将查询字符串转换为段URI?

时间:2013-01-14 11:16:13

标签: php .htaccess codeigniter uri

我正在尝试转换查询字符串;

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

进入段URI;

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

我在CodeIgniter工作。

我正在查看堆栈溢出的答案,该答案说要检查CodeIgniter的URL段指南,但我认为没有关于如何将查询字符串转换为段URI的任何信息。但是,有一种方法可以将段URI转换为查询字符串,这也会从Google中提取大量结果。

关注another stackoverflow answer,我在我的.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 screenshot

的根目录中

.htaccess文件中的代码无法正常工作,我刷新了页面,没有任何反应。隐藏index.php的代码正在运行。有谁知道为什么?

3 个答案:

答案 0 :(得分:1)

将URL转换为另一种内容的概念完全不明确,请参阅此答案的顶部,以解释重定向或重写时URL发生的情况:https://stackoverflow.com/a/11711948/851273

有两件事情发生了,我会采取疯狂的刺,并猜测你想要第二件事,因为你抱怨刷新页面没有做任何事情。


当您在浏览器中输入http://atwd/books/course?course_id=CC100&format=XML&submit=Submit时,这是通过mod_rewrite发送的请求URI:/books/course。在您的规则中,您将匹配空白URI:RewriteRule ^$ /course/%1/format/%2 [R,L]。这是你的规则不起作用的第一个原因。它不起作用的第二个原因是因为除此之外,除了images和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>

您需要调整路径以确保它们与您实际查找的内容相匹配。


要重定向浏览器并在内部将重新重写为原始网址,您需要做一些不同的事情。

首先,您需要确保所有链接都是这样的:/course/CC100/format/XML。更改您的CMS或静态HTML,以便所有链接都以这种方式显示。

然后,您需要更改规则(在您的codeigniter路由规则之前的所有),这是一个骗局:

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

答案 1 :(得分:0)

我不打算在其他答案和评论中解决已经很好解决的误解,我不能特别代表CodeIgniter,但是给了他们URL routing docs一个快速浏览,看起来非常相似大多数Web框架:


您可能只想将所有流量(与物理文件不匹配)指向前端Web控制器(index.php)并处理CodeIgniter路由中的URL管理,而不是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)中描述的路由,您可以接收参数并根据需要将它们传递给控制器​​,无需“转换”或“映射”任何内容,根据您的路由规则,您的网址无需在内部解析为/?yada=yada,CodeIgniter可以解决此问题。

您需要来自docs:

的通配符路由
$route['product/:id'] = "catalog/product_lookup";

一个粗略的例子,你可能最终看起来像是:

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

答案 2 :(得分:0)

如果我正确理解你,你可能会过度思考它。我在自己的代码中有类似的东西。

我有一个名为Source的控制器。在那个控制器中,我有以下方法:

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

这会产生:http://localhost/source/edit/12/2013,其中12表示$source_id,2013表示$year。您添加的每个参数都会自动转换为自己的URI段。它也不需要.htaccess技巧或自定义路线。