使用.htaccess创建SEF URL

时间:2015-04-09 04:11:03

标签: php apache .htaccess

如何更改以下格式的网址

  example.com/page/1

example.com/index.php?page=1

当我进入

example.com/page/1

它应该重定向到

  example.com/index.php?page=1

我的.htaccess文件需要做哪些更改?

文件夹结构如下

   -Public_html
      .htaccess
       index.php

感谢。

3 个答案:

答案 0 :(得分:2)

public_html/.htaccess文件

中使用此功能
   RewriteEngine on
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^page/([0-9])/?$ /index.php?page=$1 [QSA,NC,L]

RewriteCond检查所请求的文件名或目录是否已存在,将跳过RewriteRule

答案 1 :(得分:2)

您可以将此代码放入htaccess

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9]+)$ index.php?page=$1 [NC,L]

仅使用此代码,您现在可以访问http://example.com/page/55并查看/index.php?page=55的内容。

......问题是,您仍然可以访问http://example.com/index.php?page=55并创建了重复的内容:非常糟糕的引用(Google和其他人)。

有关重复内容的详细信息:here

解决方案:您可以添加其他规则以将http://example.com/index.php?page=55重定向到http://example.com/page/55没有任何无限循环

RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} \s/index\.php\?page=([0-9]+)\s [NC]
RewriteRule ^ page/%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9]+)$ index.php?page=$1 [NC,L]

注1:确保(在Apache配置文件中)您已启用 mod_rewrite 并允许 htaccess 文件。

注意2:由于您的规则会创建一个虚拟目录(/page/),如果您为html使用 relative 路径,则会遇到一些问题资源。确保所有链接(js,css,图像,href等)以前导斜杠(/)开头,或者在<head> html标记之后添加基础:<base href="/"> < / p>

答案 2 :(得分:2)

在我的回答中我假设你使用的是linux, 我还假设你会有更多复杂的案例,例如 你想要捕捉的一个参数

example.com/page/1/3 在这种情况下,我认为你将不得不使用你的index.php中的url解析

首先,您必须在站点根目录中设置.htaccess文件,同样您必须确保在apache配置中启用了mod_rewrite

如果您正在运行debian,可以在终端中运行此命令 确保启用此mod:

sudo a2enmod rewrite 

将htaccess文件添加到索引php文件所在位置的根目录:

/var/www/html/.htaccess

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^.*$ ./index.php
</IfModule>

根据我在index.php中的解决方案,您必须具有可以解析网址请求的函数

/*
$base path is used only if you running your site under folder
example.com/mysitefolde/index.php
*/
function getUrlParams($basePath = ''){
  $request  = str_replace($basePath, "", $_SERVER['REQUEST_URI']);
  return  explode('/', $request);
}

index.php请求到example.com/page/1/2

$request = getUrlParams($rootPath);
$module = $request[0]; // page
$moduleValue = $request[1]; // 1
$moduleValue2 = $request[2]; // 2