/ /サブディレクトリ内の.htaccessで末尾のスラッシュを削除する-apache、.htaccess、mod-rewrite

サブディレクトリ内の.htaccessを使用して後続のスラッシュを削除する - apache、.htaccess、mod-rewrite

私は「を使用して末尾のスラッシュを削除する問題があります .htaccess ファイル サブディレクトリ内に存在する.

通常、これは簡単な修正です。なぜなら、 類似、しかし構造的に異なる問題。これらのソリューションでは、 .htaccess (ルートレベルではなく)サブディレクトリに存在するファイル。

たとえば、次のファイル構造があるとします。

/subfolder/.htaccess
/subfolder/index.php
...

リクエストの末尾のスラッシュをすべて削除したい http://server/subfolder/。例えば、

  • http://server/subfolder/file/ にリダイレクトする必要があります http://server/subfolder/file
  • http://server/subfolder/news/12/ にリダイレクトする必要があります http://server/subfolder/news/12

私は現在、次のルールを持っています /subfolder/.htaccess

RewriteEngine On

# Strip ending slash
RewriteRule ^(.*)/$ $1 [L,R=301]

# Pipe request to controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

このルールを使用すると、上記の例は以下にリダイレクトされます。

  • http://server/subfolder/file/ リダイレクト先 http://server/os/path/to/subfolder/file
  • http://server/subfolder/news/12/ リダイレクト先 http://server/os/path/to/subfolder/12

つまり、からの相対パスを使用する代わりに .htaccess ポイント(この場合、 /subfolder)、オペレーティングシステムのパスを使用しています。

修正することで状況を改善できます .htaccess 使用する RewriteBase

# Strip ending slash
RewriteBase /subfolder
RewriteRule ^(.*)/$ $1 [L,R=301]

これは機能しますが、 これは望ましい解決策ではありません なぜなら、ファイルを /subfolder/newsubfolder、編集する必要があります .htaccessRewriteBase /newsubfolder。つまり、これらのファイルが別のサブフォルダーに移動されるたびに、 .htaccess ファイルは手動で更新する必要があります。したがって、ファイルのセットは移植性がありません。 手動設定.htaccess 使用するファイル 絶対パス.

よりポータブルで、どのディレクトリにもドロップでき、絶対パスに関係なく機能するソリューションが欲しいです。できれば、このソリューションは利用しないでしょう RewriteBase私の理解から、これは現在のサブディレクトリに設定できず、絶対パスを参照する必要があるためです。

私は数時間かけて解決策ですが、私が見たアイデアのほとんどは、ルートディレクトリを使用したり、環境変数を使用した厄介なハッキングを含んだりしました。どんなアイデアも素晴らしいでしょう。

回答:

回答№1は1

サブルールの.htaccessでこのルールを使用できます。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} s/+(.+?)/+[?s]
RewriteRule /$ /%1 [R=302,NE,L]

# generate rewrite base dynamically
RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::2$
RewriteRule ^(.*)$ - [E=BASE:%1]

# Pipe request to controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}index.php [L]