mod_rewrite - 将param插入路径 - 为什么有3个标题?

时间:2016-05-10 14:31:52

标签: apache .htaccess mod-rewrite

经过这些年的网络开发和所有这些教程,我仍然不确定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]

2 个答案:

答案 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]