2017-01-03 15 views
1

私はこれに似たいくつかの他の質問を見たことがありますが、答えは私のために働いていません。うまくいけば、誰かが光を当てることができます。

私はhttp://website.com/show/?id=9999のようなURLを持っていますが、私はこのページのPHPスクリプトで$_GET['id']を使用しています。書き換えルールを使用してURLをhttp://website.com/show/9999/に変換すると、$_GET['id']は機能しなくなりました。

ここで私が使用している書き換えルールです:

Options -MultiViews 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^show/(.*)$ /show/?id=$1 [NC,L,QSA] 
+0

なぜ "!-f" *と* "!-d"を持っていますか? –

+0

RewriteLogをチェックしてループを明らかにし、どのように '。()'があなたのパラメータを食べるかを調べます。 – mario

+0

!-fと!-dは、 "リテラルファイルではない"と "リテラルディレクトリではない"を意味します。これにより、スタイルシート、画像、mp3、javascriptなどを、書き換えルールを妨げずに表示することができます。 – mopsyd

答えて

1

GAH!修正しました。私は、WordPressのパーマリンクエンジンによって書き換えられたhttp://website.com/show/という重要な情報を除外しました。私のルールの "L"フラグは、ターゲットがWordPressの書き換えルールによって再び取り上げられるのを妨げていました。

0

あなたはそれらの書き換え条件を望んでいません。あなたはルールが必要です。これは動作するはずです:

RewriteEngine On 
RewriteRule ^show/([^/]*)$ /show/?id=$1 [L] 
+0

rewriteCondがないと、画像、スタイルシート、JavaScript、その他の静的資産にアクセスできなくなります。 -1 – mopsyd

+0

@Adrianopolis、それは私に500の内部サーバーエラーを与えました。 'http:// website.com/show /'もWordPressによって書き換えられたURLであるというのは問題ですか? WPはパーマリンクエンジンで 'http://website.com/?p = 540'を書き換えます。 – Bryan

+0

こんにちはブライアン...私はあなたがワードプレスを使用していたとは思わなかった。そして、動作していない資産に関するmpsydのコメントについては、それについてはわかりません。私は、私があなたに与えた簡単な書き換えルール形式を使用して資産を壊すことはありませんでした。再びWordPressについてはわからないが。 – Adrianopolis

0

idパラメータはもはやGET文字列の一部であるため$_GET['id']はもはや、作業していません。 phpが動作するよりもWebスタックの下位層でApacheの書き換えが起こるため、PHPが引き継ぐまでには、もはや$_GETという文字列はありません。 var_dump($_GET);でこれをテストし、自分で確認できます。

の言い方をすれば、次のようにして$_SERVER['REQUEST_URI']を介してアクセスすることができます。

$params = explode('/', $_SERVER['REQUEST_URI']); 
var_dump($params[0]); //This should print "show" 
var_dump($params[1]); //This should print "9999" 

あなたはこのようにそれを行うために必要な値に対応するURLのどのセグメント予期することができるようにする必要があります。通常これはルータの仕事です。

例:http://upshots.org/php/php-seriously-simple-router

+0

'var_dumb($ _ GET);'でテストしましたが、何もありません。しかし、ApacheはURLを書き換えていないので、 'website.com/show/?id = 9999'と解釈し、クエリ文字列が存在するでしょうか?なぜそれは起こっていないのですか? – Bryan

+0

Apacheはスタックの最初の層です。 PHPは、Apacheがそれを操作し終わるまで、URLが何であるかを知らない。 PHPがロードされると、スーパーグローバルは、どのようなものを手渡すかに基づいて宣言されます。したがって、Apacheが見るものと、PHPが見るものは同じものではありません。書き換え規則を保持する場合は、 '$ _SERVER ['REQUEST_URI']'を使用して取得する必要があります。 – mopsyd

関連する問題