.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

.htaccess 中的 301 重定向将旧文件路径/名称附加到新 url

.htaccess 规则将图像文件的直接视图重定向到页面,图像作为查询字符串传递