.htaccess RewriteRule无法使用查询字符串作为目录

时间:2012-12-19 22:54:46

标签: .htaccess mod-rewrite

我有以下代码:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
RewriteRule ^(.*)$ $1/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^\.]+)/$ $1.php
RewriteRule ^([^\.]+)/([^\.]+)/$ $1.php?id=$2

我遇到绝对URI的问题,它解决了。现在我想使用最后一行:

domain.com/query/ping/2/

domain.com/query/ping.php?id=2

我认为代码很好,但我仍然得到错误404.我应该给出一些重写条件吗?我搜索了这段代码但没有找到任何有用的东西。

1 个答案:

答案 0 :(得分:0)

根据您在上一个问题中放置htaccess文件的位置,您可能需要这样的内容:

RewriteCond %{REQUEST_URI} ^/query/([^/]+)/([^/]+)/?
RewriteCond %{DOCUMENT_ROOT}/query/%1.php -f
RewriteRule ^ /query/%1.php?id=%2 [L]

重要的问题是您需要在URI的开头检查/query。您拥有的内容^([^\.]+)/([^\.]+)/$/query部分以及之后的2个路径名不匹配。你的正则表达式只匹配2个路径名。

RewriteCond %{DOCUMENT_ROOT}/query/%1.php -f类似于上面的条件,它检查所请求的PHP文件是否确实存在,否则不会盲目地重写。这种情况可以确保有人试图去:

http://domain.com/query/blahblahblahblah/blah

您的服务器不会返回404错误,指出/query/blahblahblahblah.php不存在。