ディレクトリ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
おそらく、末尾のスラッシュなしですでにディレクトリ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は外部リダイレクトを(内部サブリクエストの代わりに)エラードキュメントにトリガーしますが、これは一般に望ましくありません。