1

mod_rewriteの使用に取り掛かるのに苦労しています。私はこれに約1時間グーグルをしていましたが、何もうまくいかないようです。私がやりたいのは、example.com /species.phpをexample.com/speciesに変更し、example.com /species.php?name=frog を
example.com/species/frogに変更することです 。

使用する

Options +FollowSymlinks  
RewriteEngine on  

RewriteRule ^species/(.*)$ /species.php?name=$1  

example.com/species.php?name=frogを取得してexample.com/species/frogとして表示し、

RewriteRule ^species/ /species.php  

example.com/species.phpをexample.com/species/として表示することはできますが、両方を同時に動作させることはできません。
また、末尾にスラッシュがないexample.com/speciesは常に404として表示され
ます。問題をキャッチするために/species/ディレクトリを作成することを検討しましたが、1つのspecies.phpファイルに対していくつかのルールを設定したいと思います。どんな助けでも喜んでいただければ幸いです!

編集(あと8時間は自分の質問に答えられないため):

私は両方の問題を解決したようです。.htaccessを次のように変更しました:

Options +FollowSymlinks
RewriteEngine on

RewriteRule ^species/(.*)$ /species.php?name=$1 
RewriteRule ^species/?$ /species.php 

2番目のRewriteRuleは、example.com /speciesをexample.com/species.phpに正常にリダイレクトし、他のRewriteRuleは同時に機能します。
ただし、末尾にスラッシュを付けてexample.com/species/と入力すると、example.com /species.php?name =として読み取られ、名前が送信されなかったためにエラーがスローされるため、追加しました。

if(isset($_GET['name']) && empty($_GET['name'])) {header('location: http://example.com/species');}  

example.com/species/を使用すると、/speciesにリダイレクトされて希望どおりに機能するようになります。

4

1 に答える 1

1

最初の RewriteRule で ( *0 個以上に一致) を(1 個以上に一致) に変更すると、末尾のスラッシュが使用されているかどうかが表示されなくなります。+species.php?name=

これは、+がスラッシュの後に何かを表示する必要があるためです。そうしないと、ルールが一致しません。次に、2 番目の RewriteRule はオプションのスラッシュで終わるため一致しname=ますが、ターゲット URL にクエリ文字列を追加しません。

[L]最初のルールが一致する場合、2 番目のルールを実行する必要がないため、最初のルールの後にフラグ (last)を追加することもできます。(これは、結果のリダイレクト URL で実行されている RewriteCond および RewriteRule テストを停止しないことに注意してください。他の要求と同様に、.htaccess ファイルを通過する必要があります。)

Apache 2.4 の mod_rewriteのリファレンス ドキュメントを参照してください (または、実際に使用している Apache のバージョンのドキュメントを参照してください)。

于 2012-08-18T23:00:15.597 に答える