例如,我要更改:
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时,它破坏了一切并给了我很多错误
答案 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]