为什么这个mod_rewrite改变了可见的URL?

时间:2012-01-08 12:54:50

标签: apache .htaccess mod-rewrite redirect

有谁知道为什么以下规则明显改变了浏览器的地址栏?我不想要它。

RewriteCond %{QUERY_STRING} (module)=([^&]*)
RewriteRule ^(.+?)(\/[^\/]+)?$ $1/%1%2? [NE]

应该采用类似

的网址

/模块/视频/ item12345 /?模块= 67890

并执行内部重定向到

/ module / video / 123456 / module67890(即将查询字符串语法转换为目录语法)

重定向发生,但可见的URL被换出。

有什么想法?这很烦人......提前谢谢

1 个答案:

答案 0 :(得分:0)

发表评论后,这里是.htaccess的复制粘贴:

RewriteEngine on
Options +FollowSymLinks

# ------ force trailing slashes
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ $1/ [L]

# ------ remove duplicate slashes
RewriteCond %{THE_REQUEST} \ (.*)//+(.*)\  [NC]
RewriteRule .* %1/%2 [R=301,L]

# ------ site-specific redirect rules...
RewriteCond %{QUERY_STRING} (module)=([^&]*)
RewriteRule ^(.+?)(\/[^\/]+)?$ $1/%1%2? [NE]

RewriteCond %{QUERY_STRING} (ITEM_ENT_ID)=([^&]*)&(?:amp;)?.*(FILE_SERVICE_CONF_ID)=([^&]*)
RewriteRule ^(.+?)(\/[^\/]+)?$ $1/%1%2/%3%4$2? [NE]

RewriteCond %{QUERY_STRING} (ITEM_ENT_ID)=([^&]*)
RewriteRule ^(.+?)(\/[^\/]+)?$ $1/%1%2$2? [NE]

只有一个重定向(=唯一改变URL的部分),它就在这里:

# ------ remove duplicate slashes
RewriteCond %{THE_REQUEST} \ (.*)//+(.*)\  [NC]
RewriteRule .* %1/%2 [R=301,L]

所以我的猜测是,即使这个RewriteRule只被验证一次,也有一个在客户端可见的重定向。

如果我是对的,请告诉我。

两个提示:

如果您不在托管环境中(=如果它是您自己的服务器并且您可以修改虚拟主机,而不仅仅是.htaccess文件),请尝试使用RewriteLog指令:它帮助您追踪此类问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢检查regexp的工具:

http://www.quanetic.com/Regex(别忘了选择ereg(POSIX)而不是preg(PCRE)!)