如何将mod_rewrite重定向到相对URL

jbx*_*jbx 9 apache mod-rewrite redirect

我正在尝试为漂亮的URL实现基本的URL重定向,并且由于图像,CSS等也位于相同的路径中,我需要确保如果访问URL而没有斜杠,则会自动添加.

如果我把绝对URL这样工作,这工作正常:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L]
Run Code Online (Sandbox Code Playgroud)

但是如果我将其更改为相对URL,那么每次我在文件夹中移动东西时都不必更改它,这根本不起作用.

这些是我尝试过的,都不起作用,或者将我重定向到服务器的实际内部目录路径,如/ public_html/...:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L]

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L]
Run Code Online (Sandbox Code Playgroud)

进行URL重定向的正确方法是什么,以便用户输入以下内容:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir
Run Code Online (Sandbox Code Playgroud)

他被重定向到(通过HTTP 301或302):

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑:添加更多细节,因为它似乎并不清楚.假设我正在实现一个库,我希望使用mod_rewrite拥有漂亮的URL.所以,我希望网址如下:

http://www.mydomain.com/somedir/galleries/cats
Run Code Online (Sandbox Code Playgroud)

显示猫的缩略图,而:

http://www.mydomain.com/somedir/galleries/cats/persian
Run Code Online (Sandbox Code Playgroud)

它显示了所有猫的缩略图中的一个图像,名为波斯语.所以实际上物理目录结构和重写将如下:

http://www.domain.com/somedir/gallery.php?category=cats&image=persian
Run Code Online (Sandbox Code Playgroud)

所以我想做的是在/ somedir中放一个.htaccess文件来捕获对/ gallery的所有请求,并根据它后面的虚拟子目录,在重写时使用它们作为占位符,有2个重写规则:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc]
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$  ./gallery.php?category=$1&image=$2 [nc]
Run Code Online (Sandbox Code Playgroud)

现在的问题是,事实上,画廊脚本需要一些CSS,JavaScript和图片,位于http://www.domain.com/somedir/css,http://www.domain.com/somedir/js,和HTTP ://www.domain.com/somedir/images分别.

我不想硬编码任何绝对URL,因此CSS,JS和Images将使用相对URL(./css,./ js,./ images等)引用.所以我可以按如下方式重写URL:

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc]
Run Code Online (Sandbox Code Playgroud)

问题是,由于http://www.domain.com/somedir/galleries/cats是一个虚拟目录,以上只有在用户输入时才有效:

http://www.domain.com/somedir/gallaries/cats/
Run Code Online (Sandbox Code Playgroud)

如果用户省略了尾部斜杠,mod_dir将不会添加它,因为实际上该目录实际上并不存在.

如果我使用绝对URL进行重定向重写,它可以工作:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L]
Run Code Online (Sandbox Code Playgroud)

但我不想让URL前缀硬编码,因为我希望能够将它放在我想要的任何域中我想要的任何域,所以我尝试了这个:

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L]
Run Code Online (Sandbox Code Playgroud)

但相反,它重定向到:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest
Run Code Online (Sandbox Code Playgroud)

这显然不是我想要的.

编辑:进一步澄清

我正在寻找的解决方案是避免硬编码.htaccess中的域名或文件夹路径.我正在寻找一个解决方案,如果我将.htaccess与其余的脚本和资源打包在一起,只要用户在其Web服务器上解压缩它,它就可以开箱即用.除了这个尾随斜线问题之外,所有这些都是这样的.

因此任何涉及以任何方式对.htaccess中的父目录或web服务器路径进行硬编码的解决方案都不是我想要的.

reg*_*ero 0

我不确定我是否完全理解你的问题。

由于 mod_dir 模块的存在,大多数 Apache 安装中会自动完成尾部斜杠重定向(99% 的可能性您拥有 mod_dir 模块)。

您可能需要添加:

DirectorySlash On
Run Code Online (Sandbox Code Playgroud)

但这是默认值。

所以。如果您访问foo/bar并且 bar 不是 foo 目录中的文件而是子目录,则 mod_dir 执行重定向到foo/bar/.

我知道唯一可能打破这个问题的是它Option Multiviews可能试图在目录中找到 bar.php、bar.php、bar.a-mime-extension-knwon-by-apache 。所以你可以尝试添加:

Option -Multiviews
Run Code Online (Sandbox Code Playgroud)

并删除所有 rewriteRules。如果你没有得到这个默认的 Apache 行为,你可能需要看看 mod-rewrite,但这就像使用核弹杀死蜘蛛一样。核弹的使用可能会非常棘手。

编辑: 对于 mod-rewrite 的尾部斜杠问题,您可以查看此文档 howto,说明这应该有效:

RewriteEngine  on
RewriteBase    /myParentDir/
RewriteCond    %{REQUEST_FILENAME}  -d
RewriteRule    ^(.+[^/])$           $1/  [R]
Run Code Online (Sandbox Code Playgroud)