.htaccess在省略尾部斜杠时更改URL



我在一个具有.htaccess的根域中有多个站点。这是我的

RewriteEngine On
RewriteCond %{HTTP_HOST} ^192.168.0.6$
RewriteCond %{REQUEST_URI} !/192.168.0.6/
RewriteRule ^(.*)$ /192.168.0.6/$1 [L]
RewriteCond %{HTTP_HOST} ^sub.site1.org$
RewriteCond %{REQUEST_URI} !/192.168.0.6/
RewriteRule ^(.*)$ /192.168.0.6/$1 [L]
RewriteCond %{HTTP_HOST} ^site2.com$
RewriteCond %{REQUEST_URI} !/site2.com/
RewriteRule ^(.*)$ /site2.com/$1 [L]

当我转到http://sub.site1.org/files/时,它起作用,但当我转到http://sub.site1.org/files(没有斜线(时,它会将我重定向到http://sub.site1.org/192.168.0.6/files

有办法解决这个问题吗?

# RULE#2
RewriteCond %{HTTP_HOST} ^sub.site1.org$
RewriteCond %{REQUEST_URI} !/192.168.0.6/
RewriteRule ^(.*)$ /192.168.0.6/$1 [L]

当我转到http://sub.site1.org/files/时,它起作用,但当我转到http://sub.site1.org/files(没有斜线(时,它会将我重定向到http://sub.site1.org/192.168.0.6/files

您似乎与mod_dir有冲突。如果/files/192.168.0.6/files中作为物理目录存在,则mod_dir将在重写URL后,在尾部斜杠上附加301重定向(以便"修复"URL(,从而暴露重写的URL。(您应该在重定向的URL上看到一个尾随斜杠。(

在重写请求之前,您需要手动附加尾部斜杠,方法是检查URL是否映射到新位置的目录。

如果/files是唯一可能接收这些类型请求的目录,那么您可以简单地对其进行硬编码。例如:

# Append slash to "/files"
RewriteCond %{HTTP_HOST} ^sub.site1.org$
RewriteRule ^files$ /$0/ [R=301,L]
# RULE#2 (Updated) - Rewrite request to subdirectory
RewriteCond %{HTTP_HOST} ^sub.site1.org$
RewriteCond %{REQUEST_URI} !^/192.168.0.6/
RewriteRule (.*) /192.168.0.6/$1 [L]

注意:在与子目录匹配的第二个条件中,您缺少字符串锚点(^(的开头。

您需要在测试前清除浏览器缓存,因为mod_dir错误的301(永久(重定向将被浏览器缓存。

因此,建议首先使用302(临时(重定向进行测试。

否则,对于更通用的任何目录解决方案,都需要以下内容:

# Append slash to subdirectory BEFORE rewrite
RewriteCond %{HTTP_HOST} ^sub.site1.org$
RewriteCond %{REQUEST_URI} !^/192.168.0.6/
RewriteCond %{REQUEST_URI} !.w{2,4}$
RewriteCond %{DOCUMENT_ROOT}/192.168.0.6/$1 -d
RewriteRule (.+[^/])$ /$1/ [R=301,L]
# RULE#2 (Updated) - Rewrite request to subdirectory
# (as above)

同样的问题可能也适用于规则#1准则#3。请注意,规则#1和规则#2基本相同,可以(应该(组合。

目前,在发布的规则中,没有什么可以阻止用户访问";隐藏的";子目录(如果应该知道的话(。如果用户偶然发现这个"错误",你可能会考虑重定向用户;隐藏的";子目录。

另请参阅我对一个类似问题的回答,该问题将更加详细(尽管该问题只涉及一个"站点"(。

  • URL屏蔽不适用于省略尾部斜杠的URL

最新更新