.htaccess 使用REQUEST_URI的Htaccess重定向-将域文件夹添加到URL

bbmckpt7  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(210)

在我们的共享主机服务器上,我们收到一个请求,要求将客户的域名保留在他们的服务器上,但将负责网络流量的DNS重定向到我们的服务器。
在我们的服务器上,我们必须在根目录下的.htaccess文件中添加一个条目,以将其指向服务器中的一个文件夹:

RewriteCond %{HTTP_HOST} ^(www\.)?example\.pl$ [NC]
RewriteCond %{REQUEST_FILENAME} !/WebsitesLive/Example/
RewriteRule ^(.*)$ /WebsitesLive/Example/$1 [L]

网站运行良好,但我们注意到在谷歌分析,有些人访问网站使用https://example.pl/WebsitesLive/Example .我终于意识到,(也许)这是HTTPS和非www重定向在客户的网站的htaccess文件:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

在这种情况下,%{REQUEST_URI}在重定向URL中是否包含WebsitesLive/Example
最重要的是,我该怎么阻止它?

olmpazwi

olmpazwi1#

在这种情况下,%{REQUEST_URI}是否会在重定向URL中包含WebsitesLive/Example
是的,在从根目录进行内部重写之后,REQUEST_URI服务器变量将更新为包含完整的URL路径。您可以改为在RewriteRule * 模式 * 中捕获URL路径,并使用反向引用,该反向引用将相对于包含.htaccess文件的目录。
例如:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

(You已捕获URL路径,但未使用它。)
通常情况下,如果这个规范重定向是在子目录中使用的,并且该子目录是可见URL的一部分,那么这将是不正确的,因为它将从重定向的URL中 * 删除 * 子目录。
或者,您可以在根.htaccess文件中实现规范重定向。
然而,虽然这应该防止文件系统目录在规范重定向中暴露,但这并不能 * 防止 * 用户访问该子目录(来自任何域)。由于此子目录已公开(特别是作为 * 301永久 * 重定向),则需要阻止对该子目录的直接访问或将其重定向回根目录。我们在这样做的时候需要小心重定向循环。
您可以在子目录.htaccess中使用类似下面的代码将来自用户的任何"直接"请求重定向回根目录:

# /WebsitesLive/Example/.htaccess

# Redirect direct requests to subdirectory back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

REDIRECT_STATUS环境变量在直接请求时为空,但在第一次内部重写后设置为HTTP状态码-从而防止对子目录的内部重写被重定向回根目录(无限重定向循环)。

  • 旁白 *
RewriteCond %{HTTP_HOST} ^(www\.)?example\.pl$ [NC]
RewriteCond %{REQUEST_FILENAME} !/WebsitesLive/Example/
RewriteRule ^(.*)$ /WebsitesLive/Example/$1 [L]

虽然这可能"起作用",但第二个条件太宽泛了,因为它检查/WebsitesLive/Example/没有出现在"文件系统路径"的任何地方。而您应该检查/WebsitesLive/Example/没有出现在URL路径的"开始"处。换句话说,它应该是这样的:

:
RewriteCond %{REQUEST_URI} !^/WebsitesLive/Example/
:

请注意,只有当子目录(要重写到的子目录)中没有包含mod_rewrite指令的.htaccess文件时,才需要此条件(以防止重写循环)。(因为子目录中的mod_rewrite指令完全覆盖父目录-默认情况下。)
如果子目录中没有.htaccess文件,那么很明显,您需要在根目录.htaccess文件中阻止对该子目录的直接访问,但所需的规则与上面的规则略有不同。

# /.htaccess

# Redirect direct requests to subdirectory back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^WebsitesLive/Example/(.*) https://%{HTTP_HOST}/$1 [R=301,L]

# Rewrite to subdirectory
:

相关问题