在子目录中删除.htaccess的尾部斜杠

时间:2014-12-03 07:40:42

标签: apache .htaccess mod-rewrite

我在使用存在于子目录中的.htaccess文件删除尾部斜杠时遇到问题。

通常情况下,这将是一个简单的解决方案,因为对于类似的而言,Stack Overflow上已有多个解决方案,但结构上有所不同。这些解决方案不考虑子目录中存在的.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 个答案:

答案 0 :(得分: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]