.htaccess 将查询字符串附加到内部重定向
Posted
技术标签:
【中文标题】.htaccess 将查询字符串附加到内部重定向【英文标题】:.htaccess appending query string to internal redirect 【发布时间】:2013-05-30 07:17:43 【问题描述】:我正在尝试在 .htaccess 中创建对 SEO 友好的屏蔽重写。 htaccess 文件在 localhost 和我的个人服务器上运行良好,但不幸的是在 GoDaddy 的服务器上似乎无法运行。我知道这已经是一个问题,但是为一个打算使用 Godaddy 作为他们的主机的客户工作。
问题是重写似乎强制重定向在浏览器 URL 栏中显示重写的查询字符串,而不是将其保留在内部。 例如。
规则:
RewriteRule ^/?([a-zA-Z0-9-_/]*)$ /index.php?loadPage=$1&mode=cms [L,QSA]
链接:/images
重定向到/images/?loadPage=images&mode=cms
对于浏览器,这个“应该”保留为/images/
。我在下面复制了我的简短.htaccess
,为开发块修改了 IP
<Files .htaccess>
deny from all
</Files>
Options -MultiViews +FollowSymlinks -Indexes
RewriteEngine On
RewriteBase /
# Stop Old redirection from block below
RewriteCond %REQUEST_URI "/old/"
RewriteRule (.*) $1 [L]
# Under construction Redirect
RewriteCond %REMOTE_ADDR !^0.0.0.0
RewriteCond %REQUEST_URI !^/?old/
RewriteRule ^/?(.*) “/old/$1″ [L,QSA]
#Admin utilities rewrite
RewriteRule ^/?admin/?(.*)$ /index.php?loadPage=$1&mode=backend [L,QSA]
#CMS/Frontend rewrites -- this one is failing
RewriteRule ^\/?([a-zA-Z0-9-_]+)\/?$ /index.php?loadPage=$1&mode=cms [QSA,L]
一个潜在的提示是显示的 url 是 /images/?query_string
,而不是 index.php?query_string
,因此它没有进行完全重定向,尽管外部请求从页面请求收到 301 响应。
【问题讨论】:
请参考以下链接,或者您也可以联系支持团队support.godaddy.com/groups/web-hosting/forum/topic/…和support.godaddy.com/groups/web-hosting/forum/topic/… 感谢您提供的链接,不幸的是,我对它们都进行了调查,但似乎都不适用于我的情况。 【参考方案1】:我已经注释掉了其他一些规则,以便您了解发生了什么。您正在使用不以“旧”开头的任何内容并将其重写到旧目录。前面的规则看起来就像你在找到单词'/old/'的地方拿走所有东西,然后把它重定向到它自己。您永远不会收到来自0.0.0.0
的任何请求。
最后一条规则中的连字符需要放在方括号的末尾,这样 Apache 就不会在寻找范围。
由于我们正在处理.htaccess
,因此如果我们不使用REQUEST_URI
,则不需要前面的斜线。
RewriteEngine On
RewriteBase /
# Stop Old redirection from block below
RewriteCond %REQUEST_URI ^/old/(.*)$
RewriteRule .* %1 [L]
# Under construction Redirect
# RewriteCond %REMOTE_ADDR !^0.0.0.0
# RewriteCond %REQUEST_URI !^/?old/
# RewriteRule ^/?(.*) /old/$1 [L,QSA]
#Admin utilities rewrite
RewriteRule ^admin/(.*)$ index.php?loadPage=$1&mode=backend [L,QSA]
#CMS/Frontend rewrites
RewriteCond %REQUEST_FILENAME !^index.php$
RewriteRule ^([A_Za-z0-9_-]+)/?$ index.php?loadPage=$1&mode=cms [QSA,L]
【讨论】:
0.0.0.0 IP 是我为开发而访问服务器的 IP 的占位符。我同意我对连字符有点懒惰,但是 Apache 通常可以弄清楚,因为没有以下范围字符。我已经测试了这些更改,不幸的是问题仍然存在。除了RewriteEngine和前端rewrite之外的所有规则我也注释掉了,结果还是一样,看来不是规则冲突。【参考方案2】:我没有测试任何东西,只是看看那条线......
RewriteRule ^\/?([a-zA-Z0-9-_]+)\/?$ /index.php?loadPage=$1&mode=cms [QSA,L]
存在语法错误。 9 之后的连字符应该被转义为技术上的范围指示符。大多数情况下,您会看到人们将它放在]
之前的末尾,因此它不会导致错误,因此大多数人认为他们不必逃避它。您也不需要转义正斜杠。也使用问号使前面的可选,并且不知道你为什么想要那个。所以应该是这样的:
RewriteRule ^([a-zA-Z0-9\-_]+)/?$ /index\.php?loadPage=$1&mode=cms [QSA,L]
【讨论】:
可选的结束斜杠是因为一些“很棒的”浏览器插件会在斜杠后面没有任何内容时从链接中删除尾随斜杠(与安全有关)。奇怪的是,如果我使用尾部斜杠访问,重写确实可以正常工作,但如果它不存在,则不会工作。最初的管理员重写做同样的事情(只是不那么挑剔),并且工作得很好,所以我认为你对匹配值的解释方式有所了解。我会做更多的玩弄它。 (不幸的是,建议的更改并没有改变问题)。 我为任何没有尾部斜杠的传入链接添加了 301 重定向,并让规则按照我希望的方式工作。宁愿让它在一个规则中是可选的,但它至少可以工作,哈哈。感谢您让我走上正轨!以上是关于.htaccess 将查询字符串附加到内部重定向的主要内容,如果未能解决你的问题,请参考以下文章
将查询字符串附加到 htaccess PDF 重定向 URL
使用 .htaccess 将查询字符串附加到 URL [关闭]
301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL