繁体   English   中英

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

[英]How to Convert Query String to Segment URI?

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

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

进入段URI;

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

我在CodeIgniter工作。

我正在查看一个用于检查CodeIgniter的URL段指南的stackoverflow答案,但我认为没有有关如何将查询字符串转换为段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

有两件事发生了,我将大刀阔斧地猜测您想要第二件事,因为您抱怨刷新页面无济于事。


当您在浏览器中输入http://atwd/books/course?course_id=CC100&format=XML&submit=Submit ,这是通过mod_rewrite发送的请求URI: /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路由文档一个快速的概览,它看起来与大多数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 )中所述使用路由,您可以输入参数并将其传递给您认为合适的控制器,没有需要“转换”或“映射”任何内容,您的URL不需要在内部根据CodeIgniter可以解决的路由规则解析为/?yada=yada

您将需要从文档中获取如下通配符路由:

$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欺骗或自定义路由。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM