RewriteRule不能正常工作

时间:2012-02-03 20:19:42

标签: apache mod-rewrite

我在.htaccess中写了以下规则

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)/$ profile.php?business=$1

当我输入网址时 http://www.abc.com/mujeeb/

页面被正确转移到个人资料页面,页面看起来很好。

但我在URL中输入此内容 http://www.abc.com/mujeeb

页面没有显示。

你能说出原因吗?或者为此写下规则?我尝试了很多次但没有成功。

Mujeeb。

5 个答案:

答案 0 :(得分:1)

page doesn't show.因为您指定将RewriteRule应用于最后以/结尾的网址。将其改写为

RewriteRule ^(.*)/?$ profile.php?business=$1 [L]

我希望您有额外的RewriteCond语句,以防止重定向的无限循环。

ps:基本上你可以双向阻止循环

1)检查请求的url是否与现有文件或目录不对应。它可能是最好的方法(阅读第二种方法的评论)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/?$ profile.php?business=$1 [L]

2)检查您是否请求RewriteRule中的文件。这种方法并不好,因为对于每个请求,即使对于现有文件和目录,它也会调用profile.php脚本

RewriteCond %{REQUEST_URI} !profile\.php$
RewriteRule ^(.*)/?$ profile.php?business=$1 [L]

答案 1 :(得分:1)

这是因为您使用^(.*)/$检查尾部斜杠。如果添加问号,则尾部斜杠将是可选的。

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)/?$ profile.php?business=$1

RewriteCond是必要的,以确保规则只应用一次。否则Apache将陷入无限循环。

答案 2 :(得分:0)

试试这个:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)[/]?$ profile.php?business=$1

这使得最后一个斜杠可选。

答案 3 :(得分:0)

你的规则是检查URI中的尾部斜杠,这就是/mujeeb/有效的原因,但/mujeeb却没有。将您的代码更改为:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
# If the request is not for a valid file
#RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid directory
#RewriteCond %{REQUEST_FILENAME} !-f

# your rule without trailing slash
RewriteRule ^(.*)$ profile.php?business=$1 [L,QSA]

答案 4 :(得分:0)

已经有很多好的答案。我的回答有点不同。

这就是我通常做的事情。如果请求的网址未以/结尾,我会将浏览器重定向到结尾为/的网址。这与Apache的默认行为一致(由于mod_dir)。所以,这就是我解决这个问题的方法。

RewriteEngine On

# Canonicalize http://example.com/mujeeb to http://example.com/mujeeb/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)([^/])$ /$1$2/ [R=307,L]

# Let profile.php process http://example.com/mujeeb/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ profile.php?business=$1