使用.htaccess重写URL

时间:2017-04-17 18:17:39

标签: .htaccess mod-rewrite

我正在尝试使用htaccess重写网址,但似乎无法让它正常工作。

我正在尝试重写http://website.com/pages/blog/article.php?article=blog-entry,以便可以输入http://website.com/pages/blog/blog-entry但我在尝试以下操作时遇到错误:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 

RewriteRule  ^pages/blog/(.+)$   pages/blog/article.php?article=$1 [NC,L]

任何人都可以看到我出错的地方,因为这只是给我一个404错误。提前谢谢。

2 个答案:

答案 0 :(得分:1)

  

我正在尝试改写   http://website.com/pages/blog.php?article=blog-entry以便它可以   输入为http://website.com/pages/blog/blog-entry,但我得到了一个   尝试以下操作时出错:

RewriteEngine on  RewriteCond %{REQUEST_FILENAME} !-d  RewriteCond
%{REQUEST_FILENAME}\.php -f 

RewriteRule  ^pages/blog/(.+)$   pages/blog/article.php?article=$1
[NC,L]

你的措辞令人困惑,但我相信这就是你的意思:

真正的网址是:http://website.com/pages/blog.php?article=blog-entry

您希望能够使用“友好”网址:http://website.com/pages/blog/blog-entry指向真实网址。

RewriteEngine on  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule  ^pages/blog/(.+)$  /pages/blog/article.php?article=$1   [QSA,L]

前两个测试问:这是一个存在的目录吗?这是一个存在的文件吗?因为article.php是一个文件,所以它不会包含在这个动作中,所以你不会进入无限循环,这总是存在错误地重写规则的风险。

获取给定的URL,并使用查询字符串append(QSA)将所需数据附加到将处理请求的实际文件。这不是重写,因为用户看到的url不会改变,这只发生在apache内部,它将请求发送到所需目标,并带有所需信息。

您必须测试文件或目录是否存在,否则您将错误地应用此规则,因为它只应在目标不存在时应用。这基本上是所有blog / cms的搜索引擎友好网址的工作方式,或多或少。

最后,因为目标是/blog.php?article=blog-entry你不能跳过前导/.

然而,我不清楚为什么你想要友好的网址这么久,当你可以简短,友善时:比如,页面/ [文章名称]

答案 1 :(得分:1)

/pages/blog/.htaccess

中使用此规则
RewriteEngine on 
RewriteBase /pages/blog/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-]+)/?$ article.php?article=$1 [QSA,L]