2011-07-27 5 views
0

目的:ファイル名が存在する場合、ファイル名.phpに書き換えます。.htaccessファイルuriをfile-name.htmlまたはfile-name.phpのいずれかに書き換えます。どちらかが存在する場合は

  1. http://mydomain.com/file-name
  2. http://mydomain.com/file-name.html
  3. http://mydomain.com/file-name.php

次のルールとの良好な成功を収めて、次のいずれかのように訪問者がURLを入力したかどうか - それ以外のリターンファイル名.htmlルートの.htaccessファイルで:

# REWRITE FILE URI TO file.php IF EXISTS 
Options Indexes +FollowSymLinks +MultiViews 
Options +ExecCGI 
RewriteEngine on 
RewriteBase/
# parse out basename, but remember the fact 
RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes] 
# rewrite to document.php if exists 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [S=1] 
# else reverse the previous basename cutout 
RewriteCond %{ENV:WasHTML} ^yes$ 
RewriteRule ^(.*)$ $1.html 

しかし、それ以来、私は既存のウェブサイトと一緒にrootでWPをインストールしており、これらのルールはもはや機能していません。

何WORK:file-namefile-name.htmlまたはfile-name.phpのいずれかに書き換えている - ファイルが存在している方。

WHATは動作しません。そこにはfile-name.htmlがなく、file-name.phpがある場合でもfile-name.htmlfile-name.phpに書き換えされていません。また、file-name.phpfile-name.phpがない場合はfile-name.htmlに書き換えられませんが、file-name.htmlがあります。

全体の.htaccessそれが今あるよう:

# BEGIN WP MULTISITE RULES 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 

# uploaded files 
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L] 

# add a trailing slash to /wp-admin 
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] 

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [L] 
RewriteRule ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L] 
RewriteRule ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L] 
RewriteRule . index.php [L] 
# END WP MULTISITE RULES 

# REWRITE FILE URI TO file.php IF EXISTS 
Options Indexes +FollowSymLinks +MultiViews 
Options +ExecCGI 
RewriteEngine on 
RewriteBase/
# parse out basename, but remember the fact 
RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes] 
# rewrite to document.phtml if exists 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [S=1] 
# else reverse the previous basename cutout 
RewriteCond %{ENV:WasHTML} ^yes$ 
RewriteRule ^(.*)$ $1.html 

任意のアドバイス?

+0

はい、私はWPより上のルールを移動し、再び動作します。ほとんど。つまり、 'file-name'は 'file-name.html'または 'file-name.php'のいずれかを返します。存在する場合、 'file-name.html'は 'file-name.php'を返します。しかし、 'file-name.html'と 'file-name.php'だけがない場合、 'file-name.php'は404を返します。その場合、 'file-name.php'を 'file-name.html'に書き換える原因は何でしょうか? –

答えて

0

クイック概要では、WPルールがすべてのリクエストを傍受する可能性が高いため、元のルールにはほとんど到達しない可能性があります。

この行RewriteRule^- [L]は、これらの条件を指定すると、既存のファイルまたはフォルダの書き換えを中止しますが、この行RewriteRule . index.php [L]はすべての要求を代行受信/ index.phpにリダイレクトします。

ワードプレスの上にルールを移動すると、再び動作します。ファイルの使用にこのルールを.htmlのために非既存の.phpファイルの要求を書き換える


# rewrite non-existing .php file to existing .html 
RewriteCond %{DOCUMENT_ROOT}/$1.php !-f 
RewriteCond %{DOCUMENT_ROOT}/$1.html -f 
RewriteRule ^(.+)\.php$ $1.html [L,PT] 

置き、それはあなたのルール以下(ただし、WP上記)。このルールは.phpファイルが存在しないかどうかをチェックし、.htmlファイルが存在する場合にのみ書き換えを行います。両方のファイルが利用できない場合、何も起こりません。

これらのチェックと、ルールがリライトチェーンの最上位にあるため、このルールは.phpファイル(WPページまで)に対するすべてのリクエストに対して評価され、非常に忙しいサーバ。理想的には、適切なURLを最初に置いてそのような操作をする必要はありません。

+0

ありがとう、@ LazyOne。私はあなたのルールを私の下に置き、WordPressのルールの上に置こうとしましたが、 'file-name.php'がないのに 'file-name.php'は404を返しますが、 'file-name.html'があります。 –

+0

@ user864464私は自分のローカルApacheでルールをテストしました。 _Possibly_いくつかの他のルールはそれに影響を与えます..多分あなたのWPのインストール - 私は確かに言うことはできません。最も良いことは - 書き換えデバッグ( 'RewriteLogLevel 9')を有効にして、書き直しログをチェックしてサーバー上で何が起こっているのかを確認します(ここではあなたの環境を複製できません)。私が言ったように、ここではうまくいきます。しかし、他のルールとの差し止め命令では、あなたのApacheの設定がまったく違うかもしれないという事実を考慮して、動作が異なるかもしれません。 – LazyOne

+0

@ user864464私も元のルール+私のルールを試してみました - 再びうまく動作します。それはWPの規則や何か_completely_(私は他に何があるかもしれないかわからない)何かでなければなりません。 – LazyOne

関連する問題