0

これが私の設定です:

  • mod_rewriteが有効になっているApacheを実行しているサーバーでホストされているhttp://domain.com (明らかに架空の名前...)
  • 「foo」という名前のフォルダ:( http://domain.com/foo/にあり、.htaccessファイルを入れたい)3種類のファイル.php、.htm、.htmlのみが含まれています
    • .phpファイル(例のために、そのうちの1つを参照します:phpfile.php)
    • .htmファイル(例のために、そのうちの1つを参照します:htmfile.htm)
    • .htmlファイル(例のために、そのうちの1つを参照します:htmlfile.html)
  • fooフォルダー内では、別の拡張子を持つ、または拡張子のない同等のファイルはありません(たとえば、phpfile.htmもphpfile.htmlもphpfileもfooに存在せず、php.file.phpのみが存在します)

これが私が達成しようとしていることです:

私はこれに一生懸命取り組んでいますが、.htaccessファイル(「foo」フォルダーにあります)のこのコンテンツが付属しています。残念ながら、この2つのケースの最後のケースでしか機能しません。 (つまり、「phpfile」を要求すると「phpfile.php」を提供し、「htmfile」を要求すると「htmfile.htm」を提供し、「htmlfile」を要求すると「htmlfile.html」を提供します)、これは301リダイレクトを無視します。

Options +FollowSymLinks
RewriteEngine on
RewriteBase /foo

# Redirect permanently the requests for existing .php files
# to extensionless files (non present on the server)
# so that phpfile.php gets redirected to phpfile
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} \.php$
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule (.*)\.php$ $1   [R=301,NC]

# Redirect permanently the requests for existing .htm(l) files
# to extensionless files (non present on the server)
# so that htmfile.htm gets redirected to htmfile
# so that htmlfile.html gets redirected to htmlfile
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} \.html?$
RewriteCond %{REQUEST_FILENAME}\.html? -f   
RewriteRule (.*)\.html?$ $1 [R=301,NC]

# Matching requests for non existing extensionless files
# with their existing equivalent on the server
# so that domain.com/foo/phpfile will display
# the contents of domain.com/foo/phpfile.php,
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule (.*)$ $1.php    [L]

# so that domain.com/foo/htmlfile will display
# the contents of domain.com/foo/htmlfile.html,
RewriteCond %{REQUEST_FILENAME}\.html -f    
RewriteRule (.*)$ $1.html   [L]

# so that domain.com/foo/htmfile will display
# the contents of domain.com/foo/htmfile.htm,
RewriteCond %{REQUEST_FILENAME}\.htm -f 
RewriteRule (.*)$ $1.htm    [L]

ヘルプ/アドバイスを事前に感謝します。

4

2 に答える 2

3

最初の2つのルールには、存在するphpまたはhtmlファイルであるという論理的な欠陥があります。URIチェックも事実上、書き換えルールパターンの複製であり、!fは!-dを意味します。これらを1つのルールにまとめることもできます。

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC]

最後の2つは問題ありませんが、htmlリクエストがphpよりも一般的である場合は、順序を入れ替えます。

MultiViewsが役に立たない理由

Options +MultiViewsコンテンツネゴシエーションと呼ばれる概念を実装します。これを行う際に、Apacheはサブクエリを呼び出してファイル名のルート名を解析します。それが行うことの1つは、既知のfilename.extensionの組み合わせについてディレクトリをスキャンすることです。この場合、xxx.php存在し、要求があれば、 xxx.phpxxxに置き換えて内部リダイレクトを実行します。これにより、最初のルールが実行されます。 、.php拡張子を削除すると、表示されるエラーが発生します。

したがって、(i)マルチビューを無効にする必要があり、(ii)サブクエリも同様です。(iii)再試行ループを検出して防止します。これはあなたが望むことをする1つの解決策です:

Options +FollowSymLinks  -MultiViews
RewriteEngine on
RewriteBase /foo

RewriteCond %{ENV:REDIRECT_END}  =1
RewriteRule ^ - [L,NS]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC,NS]

RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)$ $1.html   [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.htm -f
RewriteRule (.*)$ $1.htm    [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)$ $1.php    [L,E=END:1,NS]
于 2012-02-06T11:54:30.817 に答える
0

この投稿は本当に助けになり、以下のようなものを使用して私のために働いているので、みんなに感謝したいと思います...

Options +FollowSymLinks  -MultiViews
RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_END}  =1
RewriteRule ^ - [L,NS]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC,NS]

RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)$ $1.html   [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.htm -f
RewriteRule (.*)$ $1.htm    [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)$ $1.php    [L,E=END:1,NS]

このバージョンは私のために動作します。

ありがとうございました。

乾杯!

于 2013-11-22T05:22:53.063 に答える