2016-12-30 10 views
3

私の私的なブログの再構築中です。私は今、PHPでホスティングを使いたいと思っています。ただし、.phpの拡張子を非表示にして、代わりに.htmlを使用したいと思います。一方、ホストを実際にスクリプトを実行するには、.phpに書き直す必要があります。外部対応.html URLへ.phpのためのすべての要求をリダイレクト.htmlへの.phpのリダイレクト、.htaccessの.htmlへの.htmlへの内部書き換え

  1. ので、ユーザは、PHPのURLを「見る」ことはありません。だから私はしたいと思います。

  2. .htmlファイルの要求を.phpファイルに内部的に書き換えて、実際のP​​HPスクリプトを実行します。

ホスティング事業者は、私の知る限りのmod_rewriteではApacheを使用しています。

基本的に私は私が必要と考えるものがある:

RedirectEngine On 
RedirectMatch 301 ^(.*).php$ $1.html 
RewriteRule ^(.*).html$ $1.php [L] 

しかし、私は.htmlファイルに無限のリダイレクトループを取得します。あたかもRewriteRuleが自動的にRedirectMatchを再度トリガーするかのように。 RedirectMatchの代わりにRewriteRule,RewriteCondおよびRewriteBaseのさまざまな組み合わせを試しましたが、通常はリダイレクトは一部のホスト内部ディレクトリ構造(/bla/foo/user/xyz/.../file.htmlなど)に行きますが、RedirectBaseは効果がありません。

ご協力いただきましてありがとうございます。

答えて

2

このような場合は、mod_rewriteだけを使用する必要があります。 RedirectMatchはmod_aliasディレクティブであるため、競合が発生する可能性があります(設定ファイルに明らかな順序があるにもかかわらず、異なるモジュールが異なる時間に実行されます)。それでも、リダイレクト/リライトループに注意する必要があります。 REDIRECT_STATUS環境変数に対してチェック

# 1. Externally redirect `.php` requests to `.html` 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^(.+)\.php$ /$1.html [R=302,L] 

RewriteCond指令は(リダイレクトループをもたらすであろう)リダイレクトさから書き換え URLを防止します。 REDIRECT_STATUSは、最初の書き換え後(下記)、「200」(200 OK HTTPステータス)に設定されます。

正常に動作していることがわかったら(一時的)リダイレクトを301に変更してください。 301はブラウザによってキャッシュされているので、テストに問題があります。

はその後、(文字通りのドットに一致するようにドットをエスケープすることを忘れないでください)あなたが前に持っていた多くのと同じように、内部を実行します。自動的に再RedirectMatchをトリガー

# 2. Internally rewrite `.html` to `.php` 
RewriteRule ^(.+)\.html$ $1.php [L] 

RewriteRuleかのように。

はい、これは実際に起こります(上記のRewriteCondの理由)。 URLが書き換えられたり変更されたりすると、URLが変更されない限り、すべてのプロセスが繰り返されます。

が、リダイレクトは、通常、いくつかのホスティング事業者内部のディレクトリ構造に

を行くあなたはディレクトリごとの(すなわち。.htaccess)コンテキストで相対パスにリダイレクトしようとしたときに発生します。ディレクトリプレフィックス(内部ディレクトリファイルシステムパス)は、書き換えられたURLの前に置かれます。外部リダイレクトの場合は、絶対URLまたはルート相対URLを指定する必要があります。

およびRedirectBaseは効果を示さない。

まあ、RewriteBaseディレクティブは、上記の相対パスへのリダイレクトの問題を解決します。 RewriteBaseディレクティブは、相対パス置換に追加されたディレクトリプレフィックスを効果的に変更します。これがすべてです。相対パス置換を使用していない場合、効果はありません。

関連する問題