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