2009-07-12 24 views
0

私は迷惑な問題を抱えています。 PHPの$ _GET機能を使ってページのURLから変数を取得するスクリプトがあります。しかし、私は、まず第一に、私のページのURLが

http://www.example.com/something/dir2/somethingelse/page.php

これが私のために混乱しているに

http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse

から行くようにする方法を知っておく必要があります。

ここでは難しい部分があります:page.phpの最後に他のURLの値をそのまま残して、どのように$ _GET値をvalueとanothervalueにするのですか?また、ユーザーがhttp://www.example.com/something/dir2/somethingelse/page.phpを訪問した場合は、http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelseのコンテンツが表示されます。逆の場合も同様です。

これは私のサイトの運用にとって非常に重要です。事前にお手伝いいただきありがとうございます!私は.htaccessについて何も知らないが、私はそれが可能であることを知っている。

明確にするために、この非常に混乱していることは、実際には、はるかに少ない記録を必要とし、よりクリーンなURLを提供するため、実際にはもっと簡単になります。

答えて

2

このルールは、それを行う必要があります。

RewriteCond %{REQUEST_URI} !^/dir/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*) dir/$2/$4?value=$1&anothervalue=$3 [L,QSA] 

それは内部/dir/dir2/page.php?value=something&anothervalue=somethingelse/something/dir2/somethingelse/page.phpの要求を書き換えます。

しかし、それは後者を直接要求するのではなく、エイリアスを許可することを妨げるものではありません。 /dir/dir2/page.php?value=something&anothervalue=somethingelse外部/something/dir2/somethingelse/page.phpへの

リダイレクト要求は、mod_rewriteをしても可能ですが、URLのパラメータは任意の順序持つことができるので、もう少し複雑なルールが必要です。ご覧のとおり

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)value=([^&]+)&?([^&].*)?$ 
RewriteCond %3&%1%4 ^([^&]+)&(([^&]*&)*)anothervalue=([^&]+)&?([^&].*)?$ 
RewriteRule ^dir/([^/]+)/(.*) /%1/$1/%4/$2?%2%5 [L,R=301] 

、それは本当に素敵ではないのですが。より良い解決策は、PHPにどのURLがリクエストされているかを確認し($_SERVER['REQUEST_URI']参照)、PHPでリダイレクトすることです(header functionを参照)。

+0

さて、最初のURLは基本的に実際のURLのマスクとして機能し、ユーザーが実際のURLを訪問したかのようにコンテンツを表示しますか?私はまだ$ _GETできますか?これらの両方が真実なら、私は本当に幸せです!私は内部リクエストを望んでいたと思います。つまり、URLは/something/dir2/somethingelse/page.phpですが、表示されるページは/dir/dir2/page.php?value=something&anothervalue=somethingelseの内容ですか?新しいURLから変数$ _GETできるようになりますか? ありがとうございました! – Cyclone

2

あなたはそうです、それは可能です。他の人はそれに同意しないかもしれませんが、私はあなたがいるところの適切なものがthe documentation for mod_rewriteにあなたを紹介すると思う傾向があります。複雑な一連の書き換えを維持しようとしている場合は、早急にそれについて学ぶ必要があるので、今もそうであるかもしれません。

あなたは上記のポーズを特定の書き換えについては
+0

笑、それを知ってうれしいです。 妥協を許さない場合は、ドキュメントを読んで実際のコードを私に提供しますか?助けてくれてありがとう:D – Cyclone

1

、このような何かが動作するはずです:

RewriteEngine On 
RewriteRule ^/(.*)/(.*)/(.*)/(.*)\.php$ /dir/\2/\4.php?value=\1&anothervalue=\3 [L] 

...示すように、それは余分なとのパスが一致するよう、実際に私は、ドットトークンを使用してお勧めしませんが、それらのレベルとスクラップを書き直します。それぞれのドットを[^/]に置き換えることもできますが、私は正規表現を上手にしている人が私よりも見たいと思っていますし、そこにも落とし穴があるかどうかを判断してください。とにかく、重要な点は、正規表現は非常に複雑で非常に強力であり、その完全な説明はこの答えの範囲を超えているということです。一般的なチュートリアルについては、http://www.regular-expressions.infoで時間を費やしてみてください。

また、ユーザーが訪問http://www.example.com/something/dir2/somethingelse/page.php場合、彼らは右、http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse、およびその逆のためのコンテンツが表示されますか?

いいえ。それは一方通行のみです。これを行うには、2つのRewriteRulesが必要です。

$ _GETに関するご質問が分かりません。 $ _GETは、URLの各パラメータのキーと値のペアで埋められた配列です。あなたはあなたが望むようにそれらの数を使用することができます。破壊的ではありません。使用すると、URL文字列のパラメータは変更されません。

+0

よかった、ありがとう。だから、もし私がコードを使うなら、$ _GET ['value']それは書き直しでも何かを返すだろうか? – Cyclone

+0

誰かが本当にこのようなことをするPHPのMod_Rewriteスクリプトを作る必要があります..... – Cyclone

+0

はい、それは正しいです。 http://example.com/fooを利用してhttp://example.com/bar=fooに書き直すと、作成したキーと値のペアで作業することになります。ブラウザのアドレスバー。 – phenry