我想重定向到https,并在一个重定向中添加一个尾随斜杠。
这是我当前的.htaccess:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://www.test.ru%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ https://www.test.ru/$1/ [L,R=301]当我打开一个伪造的url时,我得到两个重定向。
http://www.test.ru/documents/test
301 Moved Permanently
https://www.test.ru/documents/test
301 Moved Permanently
https://www.test.ru/documents/test/有没有办法把它合并成一个重定向?
http://www.test.ru/documents/test
301 Moved Permanently
https://www.test.ru/documents/test/这也可能与
RedirectMatch 301 ^/fitness/$ /services/fitness/
RewriteRule ^fitness/$ services/fitness/ [R=301,L]这台服务器出了什么问题?我有一种感觉,规则是一个接一个地执行的。
发布于 2021-11-19 09:00:08
当您使用带有重定向标志[R=301]的Apache标志时,[L]将立即重定向,而忽略其他规则。您当前的规则需要两个背靠背的重定向。
您可以将这两个规则与[OR]标志组合在一起。我省略了X-Forwarded-Proto条件,因为如果你运行一个负载均衡器,你应该正确地配置它。
RewriteCond %{HTTPS} off [OR]
RewriteCond %{REQUEST_URI} !.*/$
RewriteRule ^(.*)/?$ https://www.test.ru/$1/ [R=301,L]使用这些规则,我们首先测试url是否与^(.*)/?$匹配。这总是正确的。最后一个斜杠是可选的,因为它后面的?,而捕获组只捕获它之前的所有内容。
然后我们检查https是否关闭。如果是,我们执行规则并重定向。如果我们已经在https上,我们检查第二个条件,并检查url是否没有以斜杠结尾。如果该条件为真,我们也会执行该规则。
规则本身确保匹配斜杠之前的所有url。这样,我们总是可以在末尾添加斜杠,而不会以多个斜杠结束。协议和主机不是可变的,所以我们在这里对其进行了硬编码。
https://stackoverflow.com/questions/70031743
复制相似问题