如何禁用 301 重定向,在 Apache 中将斜杠添加到目录名称
Posted
技术标签:
【中文标题】如何禁用 301 重定向,在 Apache 中将斜杠添加到目录名称【英文标题】:How to disable 301 redirect that adds trailing slash to directory name in Apache 【发布时间】:2012-11-01 11:57:02 【问题描述】:Apache 2.2.20 自动将所有指向目录且没有尾部斜杠的请求重定向到带有尾部斜杠的同一个 URL,如下所示:
GET /some/path/to/dir HTTP/1.1
Host: www.some.org
...
301 Moved permanently
Location: http://www.some.org/some/path/to/dir/
在所有情况下,这是一个很好的行为,但我需要为一个特殊文件夹(不是全部)关闭此功能,并且找不到我能做到的。
搜索“重写”规则一无所获——只有指令 LoadModule mod_rewrite.so。此外,目录树中的目录服务器中没有 .htaccess 文件。 有没有其他的指令?
UPD1 我尝试使用下一个配置通过 HTTP 设置 SVN:
LoadModule dav_svn_module /opt/libexec/mod_dav_svn.so
LoadModule authz_svn_module /opt/libexec/mod_authz_svn.so
NameVirtualHost *:8000
<VirtualHost *:8000>
ServerAdmin admin@some.host.org
ServerName some.host.org
DocumentRoot /path/to/wwwroot
DAVLockDB /opt/var/lock/davlock/svndavlockdb
<Directory /path/to/wwwroot>
Options FollowSymLinks Indexes
# #AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory /path/to/wwwroot/svn>
Options FollowSymLinks Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
CustomLog /path/to/wwwroot/log/access_log.txt combined
ErrorLog /path/to/wwwroot/log/error_log.txt
<Location /svn>
#AllowOverride None
#RewriteEngine Off
#RewriteOptions AllowNoSlash
DirectorySlash Off
DAV svn
SVNParentPath /path/to/wwwroot/svn
# SVNListParentPath on
AuthType Basic
AuthName "Subversion Repository"
AuthBasicAuthoritative Off
AuthUserFile /path/to/wwwroot/svn/.htauthfile
<Limit GET OPTIONS REPORT PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
Require valid-user
</Limit>
</Location>
</VirtualHost>
UPD2 似乎“DirectorySlash Off”指令仅适用于“some.host.org/svn”,不适用于“some.host.org/svn/repo1”、“some .host.org/svn/repo2" 等 - 子目录不继承此选项。
UPD3 我尝试将以下几行添加到配置中,但结果相同 - “DirectorySlash Off”仅适用于“/svn”,不适用于儿童。
<LocationMatch "/svn/.*">
DirectorySlash Off
</LocationMatch>
已解决 问题解决了。这是我的错误 - 我将 SVN 存储库根放在 DocumentRoot 文件夹下,所以 apache 和 web_dav 无法理解,谁必须处理请求。这至少适用于 TortoiseSVN 客户端。
来自 SVN 开发者的评论:
这意味着您的 httpd.conf 配置错误。通常,当您将 Subversion 虚拟“位置”定义为同时存在于两个不同的范围内时,通常会发生此错误。
例如,如果您将存储库导出为 ,但同时将 DocumentRoot 设置为 /www,那么您就有麻烦了。当请求 /www/foo/bar 时,apache 不知道是否在 DocumentRoot 中找到名为 /foo/bar 的真实文件,或者是否要求 mod_dav_svn 从 /www/foo 获取文件 /bar存储库。通常前一种情况会获胜,因此会出现“永久移动”错误。
解决方案是确保您的存储库不重叠或位于已导出为普通网络共享的任何区域内。
您也可能在 Web 根目录中有一个与您的存储库 URL 同名的对象。例如,假设您的 Web 服务器的文档根目录是 /var/www,而您的 Subversion 存储库位于 /home/svn/repo。然后,您将 Apache 配置为在 http://local.host/myrepo 处为存储库提供服务。如果您随后创建目录 /var/www/myrepo/ 这将导致发生 301 错误。
【问题讨论】:
【参考方案1】:添加
DirectorySlash Off
到.htaccess
对我来说很好。
【讨论】:
【参考方案2】:使用 mod_dir 的 DirectorySlash directive。来自文档的示例:
# see security warning in docs
<Location /some/path>
DirectorySlash Off
SetHandler some-handler
</Location>
【讨论】:
要关闭所有目录重定向,只需将其添加到 .htaccess 文件中,无需位置条件以上是关于如何禁用 301 重定向,在 Apache 中将斜杠添加到目录名称的主要内容,如果未能解决你的问题,请参考以下文章
apache 2.4中的htaccess重定向301不起作用