[已解决][rewrite]可笑的隐藏后缀问题

[已解决][rewrite]可笑的隐藏后缀问题

如何将 www.test.com/test?q=*** 重定向到 www.test.com/test.php?q=***?

QUOTE:
RewriteRule ^(.+?)\?(.*) $1.php?$2

一直搞不定啊

-----------------------------------

答案见5楼
感谢hightman给于了超越自己耐心的帮助。




QUOTE:
        RewriteRule ^(.*)(htm|html|jpg|css|js|gif|png) $1$2 [L]  // 对正常请求保持不变
        RewriteRule ^(.*)/$ $1/index.php [L]   // 修正目录请求
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule (.*) $1.php [L]  // 隐藏后缀

自己写了个,莫名其妙达到了功能,但搞不清楚是为什么

难道  (.*)  不匹配 ?q=*** 么?

另外这个需要修正目录请求,而且对.php 的请求无效了,
对 www.test.com/aa (aa 是个目录) 的请求也无效了
希望哪位朋友给一个完善的解决方法

找到解决方法了,如下(但还有新的问题,请往下看)
修正版

QUOTE:
RewriteEngine On
#These rules can go inside a <Directory> block, not in a <VirtualHost> block.
# Rewrite all URLs requested from the server
RewriteBase /

# If the request isn't a folder, and there's a .py that matches
# the last part of the path, redirect to that.
# Ex: /a/b/something/ --> a/b/something.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+[^/]) $1.php [L]

# If the request doesn't include a dot and doesn't have a slash at the end,
# add a slash and redirect
# Ex: /a/b/someresource --> /a/b/someresource/
# Ex: /a/b/someresource.ext --> no change, there's an extension
#RewriteCond %{REQUEST_FILENAME} -d
#RewriteRule ^([^.]+[^/])$ $1/ [R=permanent,L]

但是我希望用户 对浏览器直接请求www.test.com/test.php?q=***? 则会重定向到一个不存在的目录,哪位朋友帮忙一下。
尝试添加下面的配置

QUOTE:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*).php$ /error [L]

似乎[L] 起不了作用

Sometimes www.test.com/index.php?q=*** equal www.test.com/?q=***,and it's easier


QUOTE:
原帖由 xinglp 于 2007-4-23 19:41 发表
Sometimes www.test.com/index.php?q=*** equal www.test.com/?q=***,and it's easier

not sometimes, that always. but it is not index.php , maybe it is foo.php, too.php, etc..
注意:请把它放到 <VirtualHost *>下面

DocumentRoot /home/www-data

这个是hightman 写的一个完整版,不过仍然有问题。

QUOTE:
RewriteEngine On
RewriteLog logs/test-rewrite.log
RewriteLogLevel 5
RewriteCond %{REQUEST_URI}          ^[^\?]+\.php\??
RewriteRule .*                      -           [F]
RewriteCond %{REQUEST_FILENAME}                             -d                  [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}             -d         
RewriteRule (.*)                    /home/www-data$1/index.php      [L]
RewriteCond %{REQUEST_URI}          ^/([^~\?]+)
RewriteRule .*                      /home/www-data/%1.php           [L,QSA]

下面这个加了个条件,应该没有问题了,呵呵

QUOTE:
RewriteCond %{REQUEST_URI}          ^[^\?]+\.php\??
RewriteRule .*                      -           [F]
RewriteCond %{REQUEST_FILENAME}                             -d                  [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}             -d
RewriteRule (.*)                    /home/www-data$1/index.php      [L]
RewriteCond %{REQUEST_URI}          ^/([^.]+)
RewriteCond %{REQUEST_URI}          !(jpg|png|js|gif|css)
RewriteRule .*                      /home/www-data/%1.php           [L,QSA]

另一个版本:

QUOTE:
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^([^.]+[^/])$ $1/ [R=permanent,L]
RewriteCond %{REQUEST_URI}         ^[^\?]+\.php\??
RewriteRule .*                     -          [F]
RewriteCond %{REQUEST_FILENAME}                            -d                 [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}            -d
RewriteRule (.*)                   /home/www-data$1/index.php     [L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+[^/]) $1.php [L]