2016-08-22 25 views
1

これは非常に一般的なトピックですが、解決策のどれも私には当てはまりません。 私はいくつかの答えを試してみました:htaccessファイルを使用してhtml拡張子を削除する

answer 1

answer 2

answer 3

とreferalリンク。私が使用しています

htaccessのコード:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 

RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

はその後、私はサービスにservices.htmlから私のリンクを変更、すなわち私は拡張子を削除しても、FTPを使用してファイル名から拡張子を削除しました。

私のウェブサイトに表示されるページコードは、実際のページではありません。

私は自分のサーバー上でmod_rewriteをチェックして、それはあなたのファイルがまだそうでない場合は、サーバ/ブラウザがHTMLとしてそれを解釈しません、サーバー上の.html拡張子を持つ必要があり、このコードに

RewriteEngine On 
Options +FollowSymLinks 
RewriteRule ^joomla\.html http://www.joomla.org/? [R=301,L] 
+0

元のリンクはどのように見えますか? –

+0

私はあなたのブラウザに 'domain.tld/test'を入力したいと思っていますが、これは' domain.tld/test.html'に内部的に書き直すべきです(ブラウザのアドレスで変更することなくバー)?そして、 'domain.tld/test.html'を' domain.tld/test'にリダイレクトしたいと思いますか?私はそれを行う方法についての答えを書くでしょう。 –

答えて

8

を使用して正常に動作しますが、代わりにテキストを入力してください(ブラウザのコードが表示される理由です)。したがって、ftpを使用してサーバー上のファイルの名前を再度変更してください。

あなたのサーバがファイル/test.html URL /testがアクセスされたとき、あなたは内部、すなわちことを書き直したい奉仕させるために:

RewriteRule ^test[^/]$ test.html 

^は、文字列の先頭に一致するように$です最後に一致するため、URLがtestと完全に一致する場合にのみ書き換えます。その要求はtest.htmlに書き換えられます。書き換えは内部的なので、ブラウザをリダイレクトしない(アドレスバーのURLは変更されません)。また、ブラウザにリダイレクトされる外部書き換え(ルールに追加された[R])もあります。

このルールは、末尾にスラッシュ([^/]は「スラッシュでない」)が付いていないURLにも一致します。私たちはあとでスラッシュをつけてURLを扱います。

あなたが書き換えたいページごとにカスタムRewriteRuleを作成することができます。

RewriteRule ^foo[^/]$ foo.html 
RewriteRule ^bar[^/]$ bar.html 

あなたは多くのページを持っている場合、これは多くの作業ですので、あなたは、例えば、すべてのURLを書き換えすることもできますfooまたはbarfoo.html/bar.htmlに書き換え、foo/barfoo/bar.htmlに書き換える必要があります。

また、正規表現を使用してすべての要求に一致させることもできます。しかし、まず、fooが実際にはディレクトリ(index.htmlを含むことができ、あなたが提供したいサブディレクトリであるかもしれない)ではないかどうか確認する必要があります。また、fooが実際にサーバーのファイルシステム上のファイルでないかどうかを確認したいとします。それをチェックするための2つの書き換え条件があります(RewriteCond directive参照):

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

あなたはすべての要求のために書き換えルールを追加することができます。

RewriteRule ^(.+[^/])$ $1.html 

$1は最初のキャプチャグループの内容で、正規表現のキャプチャグループは、()括弧内に置かれた式です。 .は任意の文字に一致し、+修飾語句は「1つ以上」を意味します。

あなたも<request>.htmlファイルが実際のファイルシステム上に存在するかどうかを確認するために書き換え条件を追加する必要があるので、これは、500エラー(see this answer)が得られリライトループを引き起こすことに注意してください:

RewriteCond %{REQUEST_FILENAME}.html -f 

また、既に.htmlの拡張子を持つURLを書き換えたくない場合もあります。あなたがすでに上記のルールを持っているので、おそらく存在してはならない<file>.html.htmlをチェックする必要があるので、私はそれが必要ではないと思います。しかし、あなたはそれに対処する必要があれば、あなたは別の条件を追加することができます。あなたは今、処理する必要がある唯一のものは

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
# RewriteCond %{REQUEST_FILENAME} !^.+\.html$ # not really necessary 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^(.+[^/])$ $1.html 

されています

RewriteCond %{REQUEST_FILENAME} !^.+\.html$ 

だからあなたの書き換えルールは次のようになります完全にそれを置きます末尾にスラッシュがあるURL。

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)/$ $1 [R,L] 

このルールは、/(正規表現/$)で終わるURLのみと一致し、前にすべてのものをキャプチャ:URLは実際のディレクトリと一致しない場合、そのために私たちはちょうど最後のスラッシュを削除し、簡単な外部の書き換えルールを追加します末尾のスラッシュをグループ(正規表現(.+))として指定し、グループ(スラッシュを含まない)にリダイレクトします。規則の背後にあるRLflagsに注意してください。 Rはリダイレクト用で、ブラウザをリダイレクトします(アドレスバーの変更のURL)。 Lは最後のものです。つまり、このルールの後にルールは適用されませんが、ルールは再書き込み後に再び適用されます。これが他のルールが適用される場所です。


TL; DR

RewriteBase/

# handle trailing slashes (if not a directory) 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)/$ $1 [R,L] 

# rewrite rule that internally adds the .html extension 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^(.+[^/])$ $1.html 
+0

よろしくお願いいたします。ありがとうございました。そこで、ftpファイルに.html拡張子を再度追加し、アンカーから.html拡張子を削除しました。ですから、私のリンクはのように見え、これは私にURL:mydomainを与えます。私が.html拡張子なしで望んでいたように、com/work。 ftpのファイルがservices.htmlであっても、ページのコードを表示します。私はFoundationフレームワークを使用しています。 – xbass540

+0

'#もブラウザを .htmlからにリダイレクトします。実際はそうではありません。ここには何も表示されない外部リダイレクトが必要です。 – CBroe

+0

後にスラッシュを処理する方法についての説明を追加しました。サーバー上に2つのファイル、つまり 'services.html'と' services'がありますか? Foundationフレームワークは書き換えルールに影響しません。 –

-1

@simonが正しいファイルがある提案のように:

# handle trailing slashes (if not a directory) 
RewriteCond %{REQUEST_FILENAME} !-d 

RewriteRule ^(.+)/$ $1 [R,L] 

# rewrite rule that internally adds the .html extension 

RewriteCond %{REQUEST_FILENAME} !-d 

RewriteCond %{REQUEST_FILENAME} !-f 

RewriteCond %{REQUEST_FILENAME}.html -f 

RewriteCond %{REQUEST_FILENAME} !^.+\.html$ 

RewriteRule ^(.+[^/])$ $1.html 

また、私はサーバーから同じ名前を持つすべてのテキストファイルを削除しなければなりませんでしたftpを介して。

+0

@simonHanisch \t \t スラッシュ(ディレクトリでない場合)に関する修正に関する上記のファイルの不具合を発見しました。私がexample.com/services/を押すとexample.com/home/myftpuser/public_html/servicesにリダイレクトされ、404エラーが発生する – xbass540

+0

'RewriteBase /'を試すことができますか?シンボリックリンクを扱う場合、 'Options + FollowSymLinks'も必要です。また、' REQUEST_FILENAME'と 'REQUEST_URI'の違いを見てください。 –

+0

@imon Hanisch:RewriteBase /チャームのように働いた。おかげでSimon – xbass540

関連する問題