使用.htaccess替换URL中的字符时出现问题

时间:2010-09-03 22:16:11

标签: regex apache .htaccess

我已经尝试过几十种不同的方法,但却无法使用它们。我的.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的其余部分之间插入多个/。

由于

3 个答案:

答案 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}来检查它们。