1

クエリ文字列を変換しようとしています。

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

セグメント URI に。

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

私はCodeIgniterで働いています。

CodeIgniter の URL セグメント ガイドを確認するようにというスタック オーバーフローの回答を見ていましたが、クエリ文字列をセグメント URI に変換する方法に関する情報はないと思います。ただし、セグメント URI をクエリ文字列に変換する方法があり、Google からも大量の結果が得られます。

別のスタックオーバーフローの回答に続いて、.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 を非表示にするコードは機能しています。誰かが理由を知っていますか?

4

3 に答える 3

1

あるものから別のものへの「URL の変換」の概念は完全にあいまいです。リダイレクトまたは書き換え時に URL に何が起こるかについては、この回答の上部を参照してください: https://stackoverflow.com/a/11711948/851273

発生することが 2 つあります。ページを更新しても何も起こらないと不平を言っているので、2 番目のことが必要であると思います。


http://atwd/books/course?course_id=CC100&format=XML&submit=Submitブラウザに入力すると、これが mod_rewrite: 経由で送信されるリクエスト URI になります/books/course。ルールでは、空白の URI と照合しています: RewriteRule ^$ /course/%1/format/%2 [R,L]。これが、ルールが機能しない最初の理由です。それが機能しない 2 番目の理由は、その上で、画像と 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 を変更して、すべてのリンクがそのように表示されるようにします。

次に、ルールを ( 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>
于 2013-01-14T16:28:27.147 に答える
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のトリックやカスタムルートも必要ありませんでした。

于 2013-01-15T01:16:32.467 に答える
0

他の回答とコメントですでにかなりうまく対処されている誤解に対処するつもりはありません。また、CodeIgniter について具体的に話すことはできませんが、URL ルーティング ドキュメントに簡単な概要を与えると、ほとんどの Web フレームワークにかなり似ているように見えます。


おそらく、すべてのトラフィック (物理ファイルと一致しない) をフロントエンド Web コントローラー (index.php) に転送し、htaccess ファイルではなく、CodeIgniter のルーティングで URL 管理を処理したいだけでしょう。

これを行うには、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";
于 2013-01-14T20:59:38.073 に答える