1

我只是想让 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

如果有人能告诉我我做错了什么,我将不胜感激。

4

2 回答 2

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]
于 2013-04-30T08:40:47.823 回答
0

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

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

因此,第二条规则从未被尝试过。

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

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

或者

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

如果规则应该更一般。

于 2013-04-30T08:34:24.357 回答