2

mod_rewrite再マップするためにapacheを実行する方法を理解しようとしています$_GET

私が達成しようとしていること:

現在、このページにアクセスするには、次の場所にアクセスする必要があります。

http://www.domain.com/index.php?URL=pages/the-page.php

これを2つの方法で機能させたいと思います。

誰かがに行くとdomain.com/the-page、それは彼らを上記に連れて行きますが、それはこのように見え続けます。第二に、誰かがに行くとhttp://www.domain.com/index.php?URL=pages/the-page.php、それはまだとして表示されdomain.com/the-page、URLを短くクリーンに保ちます。

最近試したコード

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} URL=pages/([a-z0-9-_]+)\.php$
RewriteRule ^(.*) /%1

私はapacheですべてを正しくセットアップしたと確信していますhttpd.conf。XAMPPを使用してローカルでテストし、変更時にApacheを再起動しましたが、まだ何もありません。どこが間違っているのですか?

私はこれを.htaccessで処理したいと思います

XAMPP localhostを使用していて、ライブサーバーで試しています。

ログファイル:

127.0.0.1 - - [05/Apr/2013:16:50:43 --0400] [localhost/sid#2f3140][rid#3b14068/initial] (3) [perdir C:/xampp/htdocs/cdi/] strip per-dir prefix: C:/xampp/htdocs/cdi/index.php -> index.php

127.0.0.1 - - [05/Apr/2013:16:50:43 --0400] [localhost/sid#2f3140][rid#3b14068/initial] (3) [perdir C:/xampp/htdocs/cdi/] applying pattern '^(.*)' to uri 'index.php'

127.0.0.1 - - [05/Apr/2013:16:50:43 --0400] [localhost/sid#2f3140][rid#3b14068/initial] (1) [perdir C:/xampp/htdocs/cdi/] pass through C:/xampp/htdocs/cdi/index.php

Olafのスクリプトでログを更新しました(最後のルールはコメントアウトされています)

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (3) [perdir C:/xampp/htdocs/cdi/] strip per-dir prefix: C:/xampp/htdocs/cdi/index.php -> index.php

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (3) [perdir C:/xampp/htdocs/cdi/] applying pattern '^' to uri 'index.php'

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (3) [perdir C:/xampp/htdocs/cdi/] strip per-dir prefix: C:/xampp/htdocs/cdi/index.php -> index.php

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (3) [perdir C:/xampp/htdocs/cdi/] applying pattern '^index\.php$' to uri 'index.php'

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (2) [perdir C:/xampp/htdocs/cdi/] rewrite 'index.php' -> '/newhome?'

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (3) split uri=/newhome? -> uri=/newhome, args=<none>

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (2) [perdir C:/xampp/htdocs/cdi/] explicitly forcing redirect with http://localhost/newhome <-これが問題を引き起こしているようです

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (1) [perdir C:/xampp/htdocs/cdi/] escaping http://localhost/newhome for redirect

127.0.0.1 - - [05/Apr/2013:20:02:24 --0400] [localhost/sid#2e3140][rid#3b14090/initial] (1) [perdir C:/xampp/htdocs/cdi/] redirect to http://localhost/newhome [REDIRECT/302]

助けてくれた皆さん、ありがとうございました。私はこれを機能させるために2日間を費やしました!!!

4

4 に答える 4

2

基本的に、2つのルールが必要です。クライアントをクリーンURLにリダイレクトするルールと、きれいなURLを内部で実際のコンテンツに書き換えるルールがありますindex.php

とがディレクトリにあるindex.phpと仮定します.htaccesscdi

RewriteEngine on

# prevent endless loop
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

# redirect the client
RewriteCond %{QUERY_STRING} URL=pages/(.+?)\.php
RewriteRule ^index\.php$ /cdi/%1? [R,L]

# exclude rewriting all files located in /cdi/files
RewriteCond %{REQUEST_URI} !^/cdi/files/
# rewrite to real content
RewriteRule ^.*$ /cdi/index.php?URL=pages/$0.php [L]

更新

リクエストがの/cdi/index.php?URL=pages/abc.php場合、2番目のルールは必要なURL部分を抽出し、クライアントを新しいURLパスにリダイレクトします。次に、クライアントは新しいURL/cdi/abcを要求し、3番目のルールはこれを取得して実際のコンテンツへの内部書き換えを行います。

これはすべて正常に機能しますが、無期限に書き換えてリダイレクトします。この無限のルールを破るために、最初のルールは%{ENV:...}、リクエストがすでにリダイレクトされているかどうかを環境でチェックしてREDIRECT_STATUSから、サイクルを停止します。RewriteRule

RewriteRule ^ - [L]

これはすべてに一致し、置換^は行いませんが、フラグで書き換えサイクルを終了します[L]

STATUSシステム提供の環境/を使用する代わりに、たとえばREDIRECT_STATUSフラグを使用して自分で変数を設定し、この変数を次のようにテストすることもできます。E=SEO:1

RewriteCond %{ENV:REDIRECT_SEO} 1

REDIRECT_プレフィックスについては、使用可能な変数を参照してください。

于 2013-04-05T21:22:01.640 に答える
0

あなたはこれを試すことができます:

RewriteRule ^/([a-z0-9_-]{1,40})/?$ index.php?URL=pages/$1.php

理想的には、クエリ文字列変数の「pages /」部分を削除することをお勧めします。この固定定数は、index.phpスクリプトで処理できるためです。

于 2013-03-24T19:11:53.420 に答える
0

グループ([0-9]+)をアルファベットにしたい([a-z]+)場合は、に変更します。英数字にしたい場合は、に変更します。ハイフンとアンダースコアを使用する場合は([a-z0-9]+)、に変更します。([a-z0-9-_]+)手動で制限を設定したい場合は、この形式で行うことができます([a-z0-9-_]{1,40})。わかりますか、プラス記号はなくなりました。これは[chars]、1から何にでも{1,40}制限されており[chars]、1から40に制限されているため、どちらでも変更できます。


あなたは本当の問題が何であるか知っていますか?私のストレスは../$varを/index.php?URL=pages/$var.phpに再マップしたいと思っていても、/ index.php?URL書き換える間違った情報を提供しようとしていると想像してみてください。 = pages /$var.php/$varに。私はちょうど私の4時間の睡眠の後に気づきました。睡眠の時間が正しくないときに何が起こっているのかわかりましたか?たぶん、私の脳がうまく機能しているときに私があなたに与えるルールは、次のとおりでした。

RewriteRule ^([a-z0-9-_]+)/?$ /index.php?URL=pages/$1.php

なぜ視聴者はこれを起こさせたのですか..私の以前のコードは投票する必要があります。

于 2013-04-05T16:45:00.877 に答える
0

あなたのアプローチは問題ないようですが、あなたRewriteCondの要件は一致していません:

RewriteCond %{REQUEST_URI} ^index.php?URL=pages

「誰かが'index.phpで始まるものを要求した場合は、URLを書き換える」という意味ですが、それは誰もが要求するものではありません。あなたはあなたの訪問者がきれいなURLを要求することを望みます。

サーバーが/the-pageに対するこれらの要求のみを処理する必要がある場合は、条件を完全に削除できます。その後、任意のURLが書き換えられます。(注:これはあなたが望むものではないかもしれません!)

それ以外の場合、条件は次のようになります。

RewriteCond %{REQUEST_URI} ^[a-z0-9-_]{1,40}

正規表現をいじりたくない場合は、次のことも試してみてください。

RewriteCond %{REQUEST_FILENAME} !-f  

これは、「ユーザーがファイルが見つからないURLを要求した場合、次のURLに応じてURLを書き換える」ことを意味しますRewriteRule

于 2013-04-05T20:55:24.247 に答える