我已经尝试过几十种不同的方法,但却无法使用它们。我的.htaccess做了一些事情,比如设置自定义404和阻止图像热链接。我想在URL上做两件事:添加www。如果它不存在(相当烦人的Facebook登录无法应对两个不同的来源!),并在http:。之后用/替换//。
我试过这个:
# Replace // with /
RewriteCond %{REQUEST_URI} (.*)(?<!http:)\/{2,5}(.*)
RewriteRule .* %1/%2 [R=301,L]
而且:
# Replace // with /
RewriteCond %{REQUEST_URI} (.*).com\/\/(.*)
RewriteRule .* %1.com/%2 [R=301,L]
各种各样的排列。谁能告诉我我做错了什么?
我需要这样做,因为有时会在.com和URL的其余部分之间插入多个/。
由于
答案 0 :(得分:1)
我认为http://
根本不属于REQUEST_URI
(或者是任何其他环境变量)。它将被浏览器解析出来,并在实际请求发布之前很久就用于确定请求的性质。
我可能错了,但我认为这在htaccess级别上无法解决。首先必须正确格式化链接。
更新:查看Apache传递给PHP的信息,我认为我是对的。用于发出请求的协议不是我们可以使用的URI组件的一部分。
答案 1 :(得分:1)
以下是强制www.
:
<IfModule mod_rewrite.c>
#Add WWW
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
#End Add WWW
</IfModule>
考虑到下面提到的@Tim,我会检查%{REQUEST_URI}
是否包含//
,那将是我的RewriteCond
:
<IfModule mod_rewrite.c>
#Replace // with /
RewriteCond %{REQUEST_URI} // [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
#End Replace // with /
</IfModule>
答案 2 :(得分:0)
我不确定为什么你会遇到多个斜杠的问题,因为它应该能够以任何方式解析文件。但是,可以使用重定向检查并删除它们(我已将此与您的力量www
结合使用,因此最多只有一个外部重定向):
RewriteCond %{THE_REQUEST} ^[A-Z]+\s[^\s]*/{2,} [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)$
RewriteRule ^ http://www.%2%{REQUEST_URI} [R=301,L]
请注意,%{REQUEST_URI}
删除了重复的斜杠(仅在mod_rewrite
中,以后的脚本不适用),因此我们可以在重定向中使用它来自动处理该问题为了我们。原始请求仍然会有多个斜杠,因此我们通过检查%{THE_REQUEST}
来检查它们。