我正在尝试转换查询字符串;
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的代码正在运行。有谁知道为什么?
答案 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技巧或自定义路线。