web-dev-qa-db-ja.com

ディレクトリURLからスラッシュを削除する

ディレクトリURLの最後のスラッシュを何らかの方法で削除する必要があります。たとえば、example.com/projects/の代わりに、example.com/projectsを見たいです。私はこれまでに運のない多くの解決策を試みてきました。現在、私の.htaccessファイルは次のとおりです。

Options +FollowSymLinks
DirectoryIndex index.html

RewriteEngine on

RewriteCond %{HTTP_Host} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

RewriteCond %{THE_REQUEST} /index\.html [NC]
RewriteRule ^(.*?)index\.html$ /$1 [L,R=301,NC,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1/index\.html -f [NC]
RewriteRule ^(.+?)/?$ /$1/index.html [L]

ErrorDocument 404 http://www.example.com/error404.html
1
Oli

おそらく、末尾のスラッシュなしですでにディレクトリURLにリンクしているのでしょうか?それが最初のステップです。

これらは物理ディレクトリであるため、末尾のスラッシュを追加してこれらのURLを「修正」しないようにmod_dirに指示する必要があります。ファイルの先頭近くにあるDirectorySlashディレクティブを使用して、これを行うことができます。

DirectorySlash Off

つまり、手動で末尾のスラッシュに内部書き換えを追加する必要があります。 mod_dirは通常、スラッシュで区切られたURLに301リダイレクトするため、これはブラウザーによってキャッシュされます。テストする前に、ブラウザのキャッシュがクリアされていることを確認してください。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1/index\.html -f [NC]
RewriteRule ^(.+?)/?$ /$1/index.html [L]

これの主な問題は、最初のRewriteCondディレクティブがディレクトリの書き換えを妨げることです。これは、あなたが達成しようとしていることの反対のように思えます。代わりに次を試してください。

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f
RewriteRule ^(.+?)/?$ /$1/index.html [L]
ErrorDocument 404 http://www.example.com/error404.html

Aside:エラードキュメントへのルート相対URLを次のように指定する必要があります。

ErrorDocument 404 /error404.html

絶対URLを使用すると、Apacheは外部リダイレクトを(内部サブリクエストの代わりに)エラードキュメントにトリガーしますが、これは一般に望ましくありません。

0
MrWhite