找回密码
 新猫注册
查看: 830|回复: 0

Apache Rewrite匹配问号的写法

[复制链接]
kernel 发表于 2008-5-11 21:30:17 | 显示全部楼层 |阅读模式
把 /abc?id=123  =>  /def.php?id=123 的写法:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^id=(.+)$
RewriteRule ^/abc$ /def.php?sid=%1 [L]

RewriteRule 不会去匹配 ? 后面的字符串,需要用RewriteCond来匹配
参考:http://lists.apple.com/archives/web-dev/2006/Mar/msg00005.html

附件:
1楼:
Options +FollowSymlinks
RewriteEngine on
# Set the RewriteBase to "/" for the root level to base everything on... I guess.
RewriteBase /
RewriteRule ^oldpage.php(.+) newpage.php$1&otherid=0 [R]
-------------------------------------------------
The $1 should have all the variable stuff in it from the php.
So I'm looking for it to essentially do this:
oldpage.php?id=1 redirects to newpage.php?id=1&otherid=0
Why is this not working? Any help would be appreciated.

2楼:
Because the RewriteRule directive doesn't parse anything beyond the path portion of the requested URL. If you want to capture the query string, you have to use a RewriteCond statement to store the query string in a regex back-reference. You can then make use of the RewriteCond's back-references in a succeeding RewriteRule statement. There's actually a shortcut for doing this (check the QSA flag in the mod_rewrite docs), but you need to modify the query string in the rewritten URL, so you can't use that.

Give this a try:


RewriteCond %{QUERY_STRING} ^(.+)$

RewriteRule ^oldpage.php newpage.php?otherid=0&%1 [R]


-Brian



3楼:
So I fiddled around and came up with this:



RewriteRule ^oldpage.php newpage.php?otherid=0 [QSA,R]



Why does this work? The only thing I can figure is that the query  

string is simply added to the end (as is says in the docs) of the new  

page. But I'm not even referencing the query string in the first  

part. Do I not need to do that? Does QSA take whatever the query  



4楼:
Hey,

mod_rewrite is the swiss army knife of web deployment, so how could this be

OT? ;-)



Firstly, you're missing a question mark in your rewrite rule, every request

will at least start with a SLASH (/) and then adding QSA to your rewrite

rule might help in passing over query strings.

(QSA = QeryStringAppend)



^ matches the begining of the requested URI which will always start with a

slash as in:

    http//www.apple.com/hardware

    ^ protocol

         ^ host

                       ^ requested URI including /

   

So give this a try:



RewriteRule ^/oldpage.php(.*) newpage.php?$1&otherid=0 [QSA,R]

             ^                           ^              ^^^

             this is needed              you missed this    this QSA is new



    or even

RewriteRule ^/oldpage.php(.*) newpage.php?$1&otherid=0 [QSA,R=301]

(R=301 makes the redirect a PERMANENT redirect)



I'd even go so far to add a Rewrite Condition, so the rule doesn't have to

be run for all requests:



RewriteCond %{REQUEST_URI} ^/.*\.php.* [NC]

RewriteRule ^oldpage.php(.*) newpage.php?$1&otherid=0 [QSA,R=301]



([NC] turns on case insensitivenes on the matches so .PHP=.php etc.)



Also to debug problems with ModRewrite, it realy helps turning logging on to

see what is actualy happening:



RewriteLog "/var/log/httpd/rewrite.log"

RewriteLogLevel 13

http://blog.sina.com.cn/s/blog_3f3422fd010009ul.html
您需要登录后才可以回帖 登录 | 新猫注册

本版积分规则

手机版|小黑屋|[漫猫]动漫论坛

GMT+8, 2024-4-20 11:28

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表