HTACCESS mod_rewrite用于查询字符串

时间:2013-04-30 08:03:14

标签: php regex apache .htaccess mod-rewrite

我只是想让mod_rewrite工作,而且我有一个巨大的心理障碍,似乎没有任何工作。

我的.htaccess文件隐藏了我的文件的文件扩展名,我不确定这是否是我的重写无效的原因。

这是我的.htaccess代码:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1.php?project=$2
Options +FollowSymLinks

使用重写规则我试图将projects.php?project = 1显示为projects / project / 1

如果有人可以告诉我我做错了什么,我真的很感激。

2 个答案:

答案 0 :(得分:1)

问题不是以L(最后)标志和规则排序结束规则。用以下代码替换您的代码:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteRule ^([^/]+)/([^/]+)/$ /$1.php?project=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

答案 1 :(得分:0)

RewriteCond仅适用于第一条规则。如果您希望第二条规则具有相同的条件,则必须复制它们。

订单很重要。首先应用第一条规则并将/projects/project/1重写为/projects/project/1.php,然后再重写为/projects/project/1.php.php/projects/project/1.php.php.php,...,因为条件/path/to/projects.php -f始终为真。您必须添加一个附加条件以防止这种无限循环。

第二条规则从未尝试过。

最后,regular expression ^([^/]+)/([^/]+)/$projects/project/1不匹配。您必须添加一个尾随(\d+)以将项目编号捕获为$3

RewriteRule ^([^/]+)/([^/]+)/(\d+)$ /$1.php?project=$3

RewriteRule ^([^/]+)/([^/]+)/(\d+)$ /$1.php?$2=$3

如果规则应该更加通用。