当前位置:web 服务器 > Apache >>

Apache的Rewrite自动添加地址末尾的斜线不能用于SVN

Apache自动添加地址末尾的斜线不能用于SVN

一般来说,如果在Apache服务器上建立了一个别名work,然后使用hostname/work来访问的话,会出现404找不到文件的错误,这是因为Apache把work当作一个文件来解析了,一般我们解决这个问题的办法是通过mod_rewrite,自动把后面遗漏掉的/加上,比如:

#自动添加地址末尾的斜线

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]

另一方面,由于SVN也借助了Apache的DAV方式来进行工作,所以一般使用SVN时会建立一个别名svn,然后使用hostname/svn来进行访问。

上面两个问题加在一起,问题就随之而产生了,在使用TortoiseSVN导入import内容的时候,服务器提示302 Found,但不工作。302 Found意味着要访问的目标已经移动,用户请求将被导向到新的位置。但是似乎TortoiseSVN无法正确处理这样的情况,所以就停留在这里,不工作了。所以,需要修改设置,使得在访问svn目录下的内容的时候,不启用自动添加地址末尾斜线的功能,因此在上面的代码中,在最后的处理RewriteRule之前,加上一句:

RewriteCond %{REQUEST_URI} !/svn*

这样既不影响自动添加地址末尾斜线功能的使用,也不会干扰SVN的正常工作。

另外,Apache 2中有一个mod_dir,并且一般默认都是开启的,已经能够提供自动添加URL末尾斜线的功能了,官方说明如下:

A “trailing slash” redirect is issued when the server receives a request for a URL http://servername/foo/dirname where dirname is a directory. Directories require a trailing slash, so mod_dir issues a redirect to http://servername/foo/dirname/.

所以在一般情况下,上面使用mod_rewrite来添加斜线的设定就不需要了,一个例外的情况就是当你使用了反向代理的时候。

比如设定domain1/dir反向代理到domain2/dir,那么mod_dir就无法正确添加domain1/dir后面的斜线,所以仍然需要使用上面的mod_rewrite功能。

也许,在设定上述反向代理的同时,在domain1上设定alias dir,这样mod_dir就能够正确识别并添加domain1/dir后面的斜线了?我觉得应该是这样的,因为设定了Alias以后,mod_dir就能够识别出domain1/dir是一个目录,从而进行正确的处理了。

经过初步实践,我的设想是正确的,只需把在domain1上设定一个Alias dir,目标随意,就能够让mod_dir正确进行处理了。

为什么要尽量使用mod_dir而不是RewriteRule呢?因为我认为不需要解析httpd.conf的mod_dir应该效率会高些。:-)


-------------------------

nginx的url是目录时到底会不会自动加斜线

看到网上很多人都再说,在访问带目录的url时,nginx不会自动加斜线,有的人加了rewrite来实现,有的人设置 server_name_in_redirect off来实现。我测试了下带目录时的情况,发现斜线是可以自动加上的,其他情况我测试了后再来补全吧。网上的文章不要随便拿来用,至少也要先测试下,毕竟nginx也是在不断发展。bug也一定在不断被修复。
经过进一步测试,发现在访问带目录的url时,nginx会自动加斜线,其实是在内部自动做了一个301跳转,加了斜线。可以用httpwatch,或者 curl -I http://www.226511.com/dir来测试。

这一切都跟这些有关:

在某些情况下(具体可参考 wiki.nginx.org),Nginx 内部重定向规则会被启动,例如,当 URL 指向一个目录并且在最后没有包含“/”时,Nginx 内部会自动的做一个 301 重定向,这时会有两种情况:
1、server_name_in_redirect on(默认),URL 重定向为: server_name 中的第一个域名 + 目录名 + /;
2、server_name_in_redirect off,URL 重定向为: 原 URL 中的域名 + 目录名 + /。
以上信息应该是在做rewrite时多注意,servername和alias。可见,nginx现在是会自动加斜线的。欢迎大家也都发表下自己的看法。

Apache
IIS
Nginx
Tomcat
如果你遇到web 服务器难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,