两个简单的RewriteRule连续......但结尾有奇怪的结果

时间:2014-10-19 09:35:51

标签: apache .htaccess mod-rewrite

我对此变得疯狂.htaccess:

SetEnv PHP_VER 5_4
AddDefaultCharset UTF-8
Options +FollowSymlinks
RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L,R,QSA]

#--------------------------------------------------
# Format type management --------------------------
#--------------------------------------------------
RewriteRule ^(.*)\.(html|json|xml)$ $1?_format_=$2 [QSA,NC]

#--------------------------------------------------
# Route management --------------------------
#--------------------------------------------------
RewriteCond %{REQUEST_URI} !^/index.php$ [NC]
RewriteRule ^(.*)$ index.php?_route_=$1 [QSA,NC,L]

我正在尝试重定向:

http://mydomain/album/11.json

http://mydomain/index.php?_route_=album/11&_format_=json

不幸的是,我得到了这个:

http://mydomain/index.php?_route_=album/11/11.json&_format_=json

我真的不明白这些规则有什么问题,结果如何......

有什么想法吗?

... THX


顺便说一句,当我使用它时它会完美地工作(在第一个规则中添加第二个规则并添加L标志),但这不是我希望实现的方式:

(...)
#--------------------------------------------------
# Format type management --------------------------
#--------------------------------------------------
RewriteRule ^(.*)\.(html|json|xml)$ index.php?_format_=$2&_route_=$1 [QSA,NC,L]
(...)

1 个答案:

答案 0 :(得分:2)

很好的问题,我必须说。

您需要DPI flag来解决您的问题(它需要丢弃旧的路径信息)

  

DPI标志导致重写的URI的PATH_INFO部分被丢弃。

保持这样的规则:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

#--------------------------------------------------
# Format type management --------------------------
#--------------------------------------------------
RewriteRule ^([^.]+)\.(html|json|xml)$ $1?_format_=$2 [DPI,QSA,NC]

#--------------------------------------------------
# Route management --------------------------
#--------------------------------------------------
RewriteRule ^((?!index\.php$).+)$ index.php?_route_=$1 [QSA,NC,L]

PS:我还对您的规则进行了一些细微更改,以使正则表达式更好。