2011-01-03 7 views
1

私が達成しようとしているのは、ページ上のすべてのURLをhttp://domain.com/page/のように見せることです。ユーザーがhttp://domain.com/pageまたはhttp://domain.com/page.phpと書くと、最初のURLにリダイレクトされます。いくつかのグーグル後、私はこのコードを発見し、それが作業に近いのですが、あなたがあなたのリクエストで最後のスラッシュを省略する場合、URLはhttp://domain.com/Users/"..."/page/のようなものになり、そのためには404 私の.htaccessファイルは、次のようになりますが返されます。htaccessで末尾にスラッシュを追加しようとすると、絶対パスになります

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php 
RewriteRule (.*)\.php$ /$1/ [L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*)/$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME} !(.*)/$ 
RewriteRule (.*)/$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .*[^/]$ $0/ [L,R=301] 

私は追加ルールを追加しようとしていますが、実際にはこれを取得せず、回答を見つけることができませんでした。

答えて

2

このようなシナリオの場合、.htaccessの作成者は、ブラウザのURLバーに表示する内容とWebサーバーが返す/実行するファイルの両方を考慮する必要があります。また、各外部リダイレクトは、リライトディレクティブの処理を開始します。念頭に置いて

、URLが正しい形式であるときに、ファイルが返されるの世話取ることによって開始:[R=301]でそれらをリダイレクトすることによって、最後はスラッシュを指定しないとURLを扱う、その後

RewriteEngine on 

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

を:

RewriteRule ^/(.*)\.[^.]*$ http://www.example.com/$1/ [R=301,L] 
RewriteRule ^/(.*)$ http://www.example.com/$1/ [R=301,L] 

これら二つのルールの最初も(something.php等)、ファイル名だけでなく、ファイル名の拡張子を除去し、スラッシュを再追加することにより、後続のスラッシュがある場合の世話をするべきであることに留意されたいです。

内部ディレクトリ構造がWebサーバーのサービスと一致しない場合(多くの場合、共有ホスティングシナリオの場合と同様)、ディレクティブの直後にRewriteBaseディレクティブを追加する必要があります。説明はSee the Apache docsです。

+0

まあ、それも私を助けた! –

+0

あなたの助けてくれてありがとう、アンドリュー!それは非常にきれいに見え、私はロジックに従っていますが、これは実際にはファイル拡張子や末尾のスラッシュを使用するときに正しいファイルにアクセスします。拡張子は削除されず、後続のスラッシュも追加されません。末尾にスラッシュを使用しない場合、404が返されます。 – Fredrik

+0

@Fredrik URLの*拡張子を削除しますか?もしそうなら、あなたは内部的に.phpを追加しようとしていますか?たとえば、http://www.example.com/something.htmlでブラウザをhttp://www.example.com/something/にリダイレクトし、内部でsomething.phpを使用してリクエストを処理しますか? – Andrew

関連する問題