5

次のファイル/フォルダー構造の静的サイトがあります。

  • index.html
  • / foobar /
    • index.html
    • bob.html
    • alice.html

私は次のことを達成したいと思います:

  • .htmlすべての拡張機能を削除します。✔動作します
  • 削除しindex.htmlます(またはindex)。✔動作します
  • 末尾にスラッシュを付けずにファイルを終了したい。✔動作します
    • 誰かが末尾のスラッシュを追加した場合は、末尾のスラッシュなしでURLにリダイレクトします。✘動作しません
  • 「フォルダ」(実際index.htmlにはフォルダ内のファイル)をスラッシュなしで終了させたい。✘動作しません
    • 誰かが末尾のスラッシュを追加した場合は、末尾のスラッシュなしでURLにリダイレクトします。✘動作しません

したがって、次のURLが機能するはずです。

  • example.com/(実際には/index.html:)
  • example.com/foobar(実際には/foobar/index.html:)
  • example.com/foobar/bob(実際には/foobar/bob.html:)
  • example.com/foobar/alice(実際には/foobar/alice.html:)

次のリクエストはリダイレクトする必要があります(301):

  • example.com/foobar/にリダイレクトしますexample.com/foobar:)
  • example.com/foobar/bob/にリダイレクトしますexample.com/foobar/bob:)
  • example.com/foobar/alice/にリダイレクトしますexample.com/foobar/alice:)

ファイル/foobar.htmlが存在する場合、これにより問題が発生することがわかります。誰かがアクセスしたとき/foobarに、ディレクトリまたはファイルのどちらが要求されているかが明確ではありません。しかし、私はこれが決して起こらないようにします。


現時点では、私はこれを持っています.htaccess

# Turn MultiViews off. (MultiViews on causes /abc to go to /abc.ext.) 
Options +FollowSymLinks -MultiViews

# It stops DirectorySlash from being processed if mod_rewrite isn't. 
<IfModule mod_rewrite.c>

    # Disable mod_dir adding missing trailing slashes to directory requests.
    DirectorySlash Off

    RewriteEngine On

    # If it's a request to index(.html) 
    RewriteCond %{THE_REQUEST} \ /(.+/)?index(\.html)?(\?.*)?\  [NC]
    # Remove it. 
    RewriteRule ^(.+/)?index(\.html)?$ /%1 [R=301,L]

    # Add missing trailing slashes to directories if a matching .html does not exist. 
    # If it's a request to a directory. 
    RewriteCond %{SCRIPT_FILENAME}/ -d
    # And a HTML file does not (!) exist.
    RewriteCond %{SCRIPT_FILENAME}.html !-f
    # And there is not trailing slash redirect to add it. 
    RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]

    # Remove HTML extensions. 
    # If it's a request from a browser, not an internal request by Apache/mod_rewrite. 
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    # And the request has a HTML extension. Redirect to remove it. 
    RewriteRule ^(.+)\.html$ /$1 [R=301,L]

    # If the request exists with a .html extension. 
    RewriteCond %{SCRIPT_FILENAME}.html -f
    # And there is no trailing slash, rewrite to add the .html extension. 
    RewriteRule [^/]$ %{REQUEST_URI}.html [QSA,L]

</IfModule>

何を変更/削除/追加する必要があり.htaccessますか?よくわかりません。「一致する.htmlが存在しない場合は、欠落している末尾のスラッシュをディレクトリに追加する」とコメントされたブロックを削除しようとしましたが、これは役に立ちませんでした。

4

1 に答える 1

4

ルールのすぐ上に# Add missing trailing slashes to directories if a matching .html does not exist.、htmlファイルがあり、リクエストがディレクトリではなく、末尾にスラッシュがある場合にリダイレクトするこのルールを追加してみてください。

# if request has a trailing slash
RewriteCond %{REQUEST_URI} ^/(.*)/$
# but it isn't a directory
RewriteCond %{DOCUMENT_ROOT}/%1 !-d
# and if the trailing slash is removed and a .html appended to the end, it IS a file
RewriteCond %{DOCUMENT_ROOT}/%1.html -f
# redirect without trailing slash
RewriteRule ^ /%1 [L,R=301]

条件が正反対をチェックするため、これはそれに続くリダイレ​​クトルールと競合しないはずです。


編集:

index.htmlを処理するには、末尾のスラッシュを追加するこのルールを変更する必要があります。

# Add missing trailing slashes to directories if a matching .html does not exist. 
# If it's a request to a directory. 
RewriteCond %{SCRIPT_FILENAME}/ -d
# And a HTML file does not (!) exist.
RewriteCond %{SCRIPT_FILENAME}.html !-f
# And there is not trailing slash redirect to add it. 
RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]

に:

# Add missing trailing slashes to directories if a matching .html does not exist. 
# If it's a request to a directory. 
RewriteCond %{REQUEST_FILENAME}/ -d
# And a HTML file does not (!) exist.
RewriteCond %{REQUEST_FILENAME}/index.html !-f
# And there is not trailing slash redirect to add it. 
RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]    

これにより、末尾のスラッシュを追加する前に、index.htmlファイルがディレクトリから欠落していることが確認されます。これが必要な理由は、末尾のスラッシュがない場合、末尾のスラッシュがないと実際にすべてのディレクトリコンテンツが公開されるため、情報開示のセキュリティの問題があるためです。index.html次に、これらのルールを追加して、 :がある場合に末尾のスラッシュを削除します。

RewriteCond %{REQUEST_FILENAME} -d
# And a HTML file exists.
RewriteCond %{REQUEST_FILENAME}/index.html -f
# And there is a trailing slash redirect to remove it. 
RewriteRule ^(.*?)/$ /$1 [R=301,L]    

次に、これらのルールを直後に追加してindex.html、末尾にスラッシュがない場合を明示的に表示します(R=301ルールのフラグにnoに注意してください)。

RewriteCond %{REQUEST_FILENAME} -d
# And a HTML file exists.
RewriteCond %{REQUEST_FILENAME}/index.html -f
# And there is no trailing slash show the index.html. 
RewriteRule [^/]$ %{REQUEST_URI}/index.html [L]    
于 2012-11-05T18:49:56.017 に答える