如何在不指定路径的情况下在子目录中正确地重定向mod_rewrite?

时间:2016-09-10 02:21:57

标签: apache .htaccess mod-rewrite url-rewriting

这是我的问题:

假设我有一个网站www.example.com。我有一个应用程序subdir位于该域的文档根目录的子目录中:

/home/example/public_html/subdir/

subdir包含此.htaccess

# Redirect trailing slash if not a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /subdir/$1 [L,R=301]

有效。如果我转到http://www.example.com/subdir/not_a_directory/(显然假设not_a_directory不是目录),我会被重定向到http://www.example.com/subdir/not_a_directory这就是我想要的。

但我不想在重写规则中指定subdir.htaccess中的任何位置。我希望能够在不破坏任何内容的情况下更改应用程序的路径。我试过以下......

# Redirect trailing slash if not a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]

但我被重定向到:http://www.example.com/home/example/public_html/subdir/not_a_directory

我有点理解为什么会发生这种情况(重写规则的相对路径返回文件系统路径,而绝对或根绝对路径返回URL),但我无法弄清楚如何实现我正在寻找的东西对

有没有办法让RewriteRule中的捕获组包含路径的subdir部分?我也试过设置RewriteBase /,但它似乎没有改变任何东西。

重写规则让我很困惑,所以任何帮助都会非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用此规则,而无需在.htaccess:

中的任何位置指定subdir
RewriteEngine On

# Remove trailing slash if not a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(/.+)/$
RewriteRule /$ %1 [L,R=301,NE]

RewriteCond %{REQUEST_URI}捕获路径允许我们捕获完整的URI路径。

答案 1 :(得分:0)

尝试使用此位置来重写基础

RewriteBase subdir/