从/index.php?page=about重写网址到/ page /

时间:2015-06-08 12:55:13

标签: php apache .htaccess mod-rewrite

我确定已将其发布到其他地方,但我无法找到它。我花了几个小时研究并尝试从样本代码到生成器的所有事情。我的网站目前位于名为" new"的子文件夹中。一旦准备好发布,我将把站点移动到根文件夹。该网站是数据库驱动的,现在可以访问您需要使用这样的URL的页面:

http://domain.com/new/index.php?page=about

我想拥有它,所以URL看起来像这样:

http://domain.com/new/about/

我尝试过很多不同的事情,我不知道从哪里开始。这是我使用的index.php中的PHP代码:

$page = (isset($_GET['page']) ? $_GET['page'] : 'home');
$data = get_data($page);

get_data()只是根据在URL中传递给它的变量从数据库中获取内容。是的,在查询数据库之前,所有内容都已在函数中正确转义。

这是我当前的.htaccess文件:

Options +FollowSymLinks
RewriteEngine On

RewriteBase /new/

RewriteCond %{REQUEST_FILENAME} -f [NC,OR] 
RewriteCond %{REQUEST_FILENAME} -d [NC] 
RewriteRule .* - [L]

RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9]+)/$ index.php?page=$1

奇怪的是/ new / home / works但是其他任何像/ new / contact-us /都不起作用。我唯一能想到的是/ home /是唯一一个没有' - '网址中的字符。我在.htaccess中遗漏了一些东西来解释这个问题吗?

3 个答案:

答案 0 :(得分:3)

  

奇怪的是/ new / home / works但是其他任何像/ new / contact-us /都不起作用。我唯一能想到的是/ home /是唯一一个没有' - '网址中的字符。我在.htaccess中遗漏了一些东西来解释这个问题吗?

你绝对想念破折号。您正在使用的正则表达式 -

^([a-zA-Z0-9]+)$

使用不包含短划线的字符范围。让我们按部分分解正则表达式:

  • ^将匹配锚定到字符串的开头
  • (开始进行子匹配分组
    • [开始一个字符类 - 这个字符为[a-zA-Z0-9]+,它匹配三个不同的范围一次或多次;指定的范围是:
      • a-z匹配小写字母字符abcdefghijklmnopqrstuvwxyz
      • A-Z匹配大写字母字符ABCDEFGHIJKLMNOPQRSTUVWXYZ
      • 0-9匹配数字字符0123456789
    • ]结束字符类
    • +指定字符类应匹配一次或多次
  • )结束子匹配组
  • $将匹配结束于字符串

请注意,您在角色类中指定的范围均不包含短划线。要匹配短划线,您需要在字符类中包含短划线,如下所示:

^([a-zA-Z0-9-]+)$

有关角色类的更多信息,维基百科中regular expressions上的条目提供了大量信息。

答案 1 :(得分:2)

试试这个:[a-zA-Z0-9_-.][\w.]+

请查看此answer以获取更多信息。

答案 2 :(得分:2)

让我们专注于你的正则表达式

RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9]+)/$ index.php?page=$1

在这里,您重写与模式匹配的所有内容:

以字母开头(大写与否或数字),但在正则表达式中不包括“ - ”。

然后你可以尝试:

RewriteRule ^([a-zA-Z0-9-]+)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9-]+)/$ index.php?page=$1

但是,如果你这样做,你允许这样的网址:   的index.php?页= -------

如果你只想要联系我们的网址

RewriteRule ^([a-zA-Z0-9]+(-[A-Za-z])*)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9]+(-[A-Za-z])*)/$ index.php?page=$1

允许这样的网址:

index.php?page=ABaC8 or index.php?page=ABnC9-AIeE

例如。