httpd.conf中的RewriteMap与.htaccess中的RewriteRule冲突

时间:2017-02-23 17:27:18

标签: .htaccess redirect mod-rewrite url-rewriting rewritemap

我正在一个网站上工作,我有很多短网址,这些网址被重定向到更大版本的网址。这个想法是短URL是脱机分发的,用户通常会在浏览器地址栏中记住它们并输入类型。例如: http://www.example.com/abc应重定向到http://www.example.com/higher_education/companion/politics/abc.html
还有一些外部链接。比如:http://www.example.com/google会将用户重定向到https://www.google.com
编辑 - 还有另一种方案,http://www.example.com/elementary/def.html将重定向到http://www.example.com/elementary/xyz.html
但是,我们现在希望使用RewriteMap实现此目的。我们为此编写的代码如下:

<IfModule rewrite_module>
RewriteEngine on
RewriteMap custommap txt:/var/www/vhosts/example.com/httpdocs/map.txt
#RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule "^(.*)$"  "${custommap:$0}" [R,L,NC]
</IfModule>

map.txt包含:

abc http://www.example.com/higher_education/companion/politics/abc.html
google https://www.google.com

问题是.htaccss文件还包含一些RewriteRule。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)\.html$ /index.php?sid=$1&ssid=$2 [L,NC,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /index.php?sid=$1 [L,NC,QSA]

因此.html附带的任何请求都将由index.php作为标准CMS功能提供。但是,现在代码进入重定向循环。 如果有人为了缓解这个问题而分享一些亮点,那就太好了。 Apache版本是2.2,所以我不能使用任何IF-ELSE。

的问候,
Aneek

1 个答案:

答案 0 :(得分:0)

您应该对来自RewriteMap

提供网址的规则设置一些限制
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond ${custommap:$0} !^$
RewriteRule ^[^.]+$ ${custommap:$0} [R=301,L,NE]

这将确保custommap只处理URI中没有DOT的非文件和非目录。

更重要的是它还会在重定向之前检查custommap中是否存在映射。

确保在测试此更改之前清除浏览器缓存。