2014-12-03 117 views
1

我在使用存在于子目录中的.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,我会编辑.htaccessRewriteBase /newsubfolder。也就是说,无论何时将这些文件移动到不同的子文件夹,.htaccess文件都需要手动更新。因此,该组文件将不可携带,因为它们需要手动配置.htaccess文件使用绝对路径

我想要一个更具可移植性的解决方案,可以放在任何目录下工作,不管其绝对路径如何。最好这个解决方案不会使用RewriteBase,因为根据我的理解,这不能设置为当前的子目录并且必须引用绝对路径。

我花了好几个小时试图想出一个解决方案,但我见过的大多数想法都涉及到使用根目录或涉及环境变量的一些讨厌的黑客攻击。任何想法都会很棒。

回答

1

您可以在subdolder的.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] 
+0

你的答案部分工作。如果你有多个尾部斜杠(例如'/ subfolder/slash ///'),这些规则就会失败,但是如果你正在路由一个目录(比如从/子文件夹/公共文件到子文件夹)其中'.htaccess'在'/子文件夹/ p​​ublic/.htaccess'中)。 – 2014-12-03 16:02:42

+0

感谢您的更新。现在删除了多个尾部斜杠。我仍然得到一个内部的几个(500)错误与别名目录。这发生在最后一行('^ index.php')。这可以通过使用'RewriteBase'来解决,但是您是否有任何建议来解决请求传递给控制器​​的问题? – 2014-12-03 20:45:23

+0

什么是您用于别名目录的确切URL?你能检查Apache error.log是否有500错误的原因? – anubhava 2014-12-03 20:50:49