GET变量显示在.htaccess的URL中重写不与/终止的URL

时间:2010-08-25 03:16:20

标签: apache .htaccess mod-rewrite

如果原始请求没有以正斜杠(/)终止,我的重写暴露GET变量时遇到问题。

这是我的规则:

# All requests are routed to PHP
RewriteRule ^(.*)$ framework/index.php?framework=$1&%{QUERY_STRING} [L]

如果我访问:

http://www.domain.com/folder/

一切都很好。如果我访问:

http://www.domain.com/folder

我被重定向到:

http://www.domain.com/folder/?framework=folder

是什么给出了?

1 个答案:

答案 0 :(得分:2)

听起来您的网络根目录中存在/folder。由于您尚未向Apache发送斜杠终止的URL,并且请求的资源是文件夹,因此DirectorySlash指令强制重定向到更正的URL。

不幸的是,mod_rewrite在您发出此重定向之前已按照您的请求进行操作,虽然它不会更改用于生成重定向的URI,但它对查询字符串所做的更改不会分开以mod_dir知道不包含它们的方式。因此,当重定向发送回浏览器时,它会包含RewriteRule生成的查询字符串。

对此的潜在解决方案(除了关闭DirectorySlash之外,由于文档中列出的原因而不建议这样做)是作为规则集的一部分执行mod_dir的工作:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{HTTPS}s ^on(s)|off
RewriteRule [^/]$ http%1://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]

RewriteRule ^(.*)$ framework/index.php?framework=$1 [QSA,L]