1

我的网页上有一个重写规则。

RewriteEngine On

RewriteRule ^(.*) index.php?p=$1 [L]

我希望它能够工作,所以它会像这样重写 URL:

http://example.com           -> index.php
http://example.com/home      -> index.php?p=home
http://example.com/lol       -> index.php?p=lol

但是当我在 index.php 中使用以下 php 代码时

print_r($_GET)

它给出了这个:

Array ( [p] => index.php )

它在所有 URL中给出相同的结果(我尝试了这些:http://example.com、、、、http://example.com/http://example.com/abouthttp://example.com/about/

你能帮我debig这个吗?

4

2 回答 2

0

问题是您重写的 URL 仍然与规则匹配,并且您得到了新的重写:

http://example.com/home
http://example.com/index.php?p=home
http://example.com/index.php?p=index.php

由于[QSA]未设置标志,因此新p参数替换了前一个参数。(我不完全确定为什么你没有得到一个无限循环,我想 mod_rewrite 会进行检查以避免无用的重定向)。

您需要添加其他条件。例如,只有当 URL 与物理文件或目录不匹配时,您才能进行重写:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?p=$1 [L]
于 2013-05-02T10:55:05.993 回答
0

我想通了:

正确的代码是这样的:

RewriteEngine On
RewriteRule ^([^.]+)/?$ index.php?p=$1  [NC,L]

对不起这个问题。

于 2013-05-02T10:37:37.593 回答