我在使用存在于子目录中的.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
,我必须编辑.htaccess
到RewriteBase /newsubfolder
。也就是说,只要将这些文件移动到不同的子文件夹,就需要手动更新.htaccess
文件。因此,这组文件不可移植,因为它们需要.htaccess
文件的手动配置才能使用绝对路径。
我想要一个更便携的解决方案,可以放入任何目录并且无论其绝对路径如何都可以工作。优选地,此解决方案不会使用RewriteBase
,因为根据我的理解,这不能设置为当前子目录并且必须引用绝对路径。
我花了几个小时试图找到一个解决方案,但我见过的大多数想法都涉及使用根目录或涉及一些讨厌的黑客与环境变量。任何想法都会很棒。
答案 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]