经过这些年的网络开发和所有这些教程,我仍然不确定mod_rewrite究竟是如何工作的,需要你的帮助!
我有这样的网址:
http://example.com/index.php?search_expression=foo&otherInstance=bar
除了其他实例之外,还有更多或更少或不同的参数。我希望它重定向到
http://example.com/bar/index.php?search_expression=foo&test=val
(& test = val仅用于测试。)
我试过了:
RewriteCond %{THE_REQUEST} GET\s\/?(.*)\?(.*)otherInstance=([^\&]*)(&?\S*)\s [NC]
RewriteRule ^(.*)$ /%3/?%2%4&test=val [L]
但是得到一个服务器错误。它说:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
当我添加[R]时,它会重定向到正确的路径,但其余的参数都会丢失。看到网络协议显示有三个标题,一个包含旧参数(otherInstance,search_expression),一个包含新参数(search_expression,test),另一个空。所以必定存在一些根本性的错误,但是我研究了多少例子,我无法弄清楚它是什么。所以请赐教!
〜编辑〜
也许我必须解释一下最后一部分的含义:在浏览器中输入上面的URL时,我会被重定向到
http://example.com/bar/index.php
没有可见的查询字符串。查看网络协议显示,查询的GET部分正在发送三次,如上所述。 PHP脚本自然地取了$ _GET的最后一个为空。第一个包含原点GET参数(search_expression = foo& otherInstance = bar),第二个包含所需的参数(search_expression = foo& test = val),第三个参数为空。所以我做的不是那么错?我的问题是为什么它们是查询中的第三个空的$ _GET部分。
〜编辑2~
感谢巴拿马杰克,我试图在替换字符串中添加第二个问号而不是它应该这样做。但我没有最简单的线索,为什么,如果有人能解释我会让我更开心!规则号是
RewriteCond %{THE_REQUEST} GET\s\/?(.*)\?(.*)otherInstance=([^\&]*)(&?\S*)\s [NC]
RewriteRule ^(.*)$ /%3/?%2%4? [R,L]
答案 0 :(得分:0)
没有R标志的mod_rewrite RewriteRule指令允许您在后台/静默(外行的术语)中重写页面。
示例:RewriteRule ^example-uri/(.*)$ /path-to-file/example.php [L]
那么example-uri页面的访问者将看到example-uri页面的URI | URL,但页面的实际内容将是/path-to-file/example.php文件的内容。 / p>
当您使用R标志时,您将重定向到另一个URI | URL,而不是在后台静默重写内容。
示例:RewriteRule ^example-uri/(.*)$ /path-to-file/example.php [R]
example-uri页面的访问者将被重定向到/path-to-file/example.php,并将看到example.php页面的URI | URL。
查询字符串是一种不同类型的动物,浏览器处理/处理的方式与典型/标准“静态”URI的URL不同。 问号表示查询字符串的开始,浏览器开始处理问号处的查询字符串参数。 查询字符串由浏览器缓存,因此如果您使用查询字符串htaccess代码更改内容,则应在每次对htaccess代码所做的更改之间清除浏览器缓存。
好的,所以看起来你想要的是使用这个htaccess代码替换Redirect和Query String:
# Match, Redirect & replace the search_expression=foo&otherInstance=bar Query String
# Destination URI with Query String replacement: http://example.com/bar/index.php?search_expression=foo
RewriteCond %{QUERY_STRING} ^search_expression=foo&otherInstance=bar$ [NC]
RewriteRule ^(.*)$ /bar/$1?search_expression=foo [R=301,L]
更多信息&查询字符串的示例:剥离,添加或替换查询字符串&重定向 http://forum.ait-pro.com/forums/topic/htaccess-redirect-code-where-do-i-add-redirect-htaccess-code/
答案 1 :(得分:0)
我不知道你的意思
当我添加[R]时,它会重定向到正确的路径,但其余部分重定向 参数丢失。
如果您只是想更改网址以删除参数,那么您应该可以像这样重定向。
无论URL search_expression& otherInstance在哪里找到,都应该匹配。
RewriteEngine on
RewriteCond %{QUERY_STRING} (?:^|&)search_expression=([^&]+)&otherInstance=([^&]+)(&|$) [NC]
RewriteRule ^ /index.php?search_expression=%1? [R=302,L]