使用.htaccess从URL重写PHP变量

时间:2018-12-13 15:16:58

标签: php .htaccess

例如,我要更改:

  

www.example.com/forum/thread?id=1&topic=hello

  

www.example.com/forum/thread/1/hello

我环顾四周并修改了.htacess文件,使其看起来像这样来修改这些URL

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^thread/([0-9]+)/([0-9a-zA-Z_-]+) thread.php?id=$1&topic=$2 [NC,L]

我不断收到404错误,提示该文件不存在。我想知道是否是因为我首先使用以下方法从文件中删除了.php:

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

但是当我删除该规则并转到thread.php?id = 1&topic = hello时,它破坏了一切并给了我很多错误

2 个答案:

答案 0 :(得分:1)

在您的问题中,您声明要更改:

www.example.com/forum/thread?id=1&topic=hello到www.example.com/forum/thread/1/hello

但是,这是倒退的。

您将改写为的地址必须是服务器可以解释的地址。因此,www.example.com/forum/thread/1/hello应该是用户输入的“友好”地址,重写应添加 .php扩展名(尽管进行了重写,但这将在地址栏中对用户不可见)

尝试一下:

RewriteEngine on RewriteRule ^/?thread/([0-9]+)/([0-9a-zA-Z_-]+) /thread.php?id=$1&topic=$2

转到thread.php可能会出错,原因是您有删除.php的规则(现在服务器将无法呈现该页面)。使用上述重写规则,您将可以通过以下步骤进行操作: www.something.com/thread/1/hello

答案 1 :(得分:0)

您的规则将永远不会应用,因为您正在使用RewriteCond %{REQUEST_FILENAME}\.php -f,此条件将检查文件系统以查看/forum/thread/1/hello.php是否存在,如果不存在,则将忽略您的规则。只需注释掉该条件或从您的规则中删除该条件。

尝试:

RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{REQUEST_FILENAME}\.php -f
 RewriteRule ^thread/([0-9]+)/([0-9a-zA-Z_-]+) thread.php?id=$1&topic=$2 [NC,L]