mod_rewriteルールの適用に一貫性がない問題

mod_rewriteルールの適用に一貫性がない問題

そこで、現在 Apache (バージョン 2.4.9 です。興味があれば) で実行している Web アプリケーションの URL をクリーンアップするように依頼されましたが、mod re_write コマンドを数時間いじった後、ぐるぐる回っているように感じました。私がやろうとしていることは次のとおりです。

URLが次のような場合(http://www.foo.bar/admin/index.php)のように表示されます。http://www.foo.bar/admin

URLが次のような場合(http://www.foo.bar/admin/testpage.php)のように表示されます。http://www.foo.bar/admin/テストページ

URLが次のような場合(http://www.foo.bar/admin/testpage.php?id=15&foo=www)のように表示されます。http://www.foo.bar/admin/testpage?id=15&foo=www

これまでのところ、index.php はほぼ解決し、2 番目の例はときどき解決しています。基本的に、私が持っているコードは非常に不安定で、ファイル ツリーの 2 レベル下しか解決しません。そのため、誰かこの件について助けてくれる人はいないかと思っています。vhost ファイルには次の内容が含まれています (すべてのディレクトリに .htaccess ファイルとして保存したくなかったため)。

AllowOverride None
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /$1/$2/$3.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

答え1

次のようなものが機能するはずです:

RewriteRule ([^/]+)/(.*)/?index.php$ $1
RewriteRule \.php $1

編集: 最初のルールは、よりわかりやすい次のルールに置き換えることができます。

RewriteRule (.*)/index\.php?$ $1

例:

URL =http://www.foo.bar/admin/index.php

一致したルール =RewriteRule ([^/]+)/(.*)/?index.php$ $1

結果 :http://www.foo.bar/admin


URL =http://www.foo.bar/admin/testpage.php

一致したルール =RewriteRule \.php $1

結果 =http://www.foo.bar/admin/testpage


URL =http://www.foo.bar/admin/testpage.php?id=15&foo=www

一致したルール =RewriteRule \.php $1

結果 =http://www.foo.bar/admin/testpage?id=15&foo=www

関連情報