我在使用存在于子目录中的.htaccess
文件删除尾部斜线时遇到问题。在子目录中使用.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
,我会编辑.htaccess
至RewriteBase /newsubfolder
。也就是说,无论何时将这些文件移动到不同的子文件夹,.htaccess
文件都需要手动更新。因此,该组文件将不可携带,因为它们需要手动配置的.htaccess
文件使用绝对路径。
我想要一个更具可移植性的解决方案,可以放在任何目录下工作,不管其绝对路径如何。最好这个解决方案不会使用RewriteBase
,因为根据我的理解,这不能设置为当前的子目录并且必须引用绝对路径。
我花了好几个小时试图想出一个解决方案,但我见过的大多数想法都涉及到使用根目录或涉及环境变量的一些讨厌的黑客攻击。任何想法都会很棒。
你的答案部分工作。如果你有多个尾部斜杠(例如'/ subfolder/slash ///'),这些规则就会失败,但是如果你正在路由一个目录(比如从/子文件夹/公共文件到子文件夹)其中'.htaccess'在'/子文件夹/ public/.htaccess'中)。 – 2014-12-03 16:02:42
感谢您的更新。现在删除了多个尾部斜杠。我仍然得到一个内部的几个(500)错误与别名目录。这发生在最后一行('^ index.php')。这可以通过使用'RewriteBase'来解决,但是您是否有任何建议来解决请求传递给控制器的问题? – 2014-12-03 20:45:23
什么是您用于别名目录的确切URL?你能检查Apache error.log是否有500错误的原因? – anubhava 2014-12-03 20:50:49