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服务器路径进行硬编码的解决方案都不是我想要的.
我不确定我是否完全理解你的问题。
由于 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)
| 归档时间: |
|
| 查看次数: |
7087 次 |
| 最近记录: |