rewrite URL from /index.php?page=about to /page/


rewrite URL from /index.php?page=about to /page/

我确定这已经张贴在其他地方,但我找不到它。我花了几个小时研究并尝试了从示例代码到生成器的所有东西。我有一个网站,目前居住在一个名为"新"的子文件夹。我将把网站移动到根文件夹一旦它准备好启动。该网站是数据库驱动的,现在要访问页面,你需要使用这样的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/工作,但其他任何像/new/contact-us/不工作。我唯一能想到的是/home/是唯一一个没有'-'字符的url。我是否在我的。htaccess中丢失了一些东西来解释这个?

奇怪的是/new/home/工作,但其他任何像/new/contact-us/不工作。我唯一能想到的是/home/是唯一一个没有'-'字符的url。我是否在我的。htaccess中丢失了一些东西来解释这个?

你绝对错过了一些东西来解释破折号。您正在使用的正则表达式——

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

使用不包括破折号的字符范围。让我们按部分分解正则表达式:

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

    注意,你在字符类中指定的范围都不包括破折号。要匹配破折号,还需要在字符类中包含破折号,如下所示:

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

    关于字符类的更多信息,Wikipedia中关于正则表达式的条目有很好的信息

    试试:[a-zA-Z0-9_-.]['w.]+

    让我们关注您的regexp

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

    在这里重写所有匹配的模式:

    以字母(大写或非大写或数字)开头,但不能在regexp中包含"-"。

    你可以试试:

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

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

    如果你想要像contact-us这样的url

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

    允许如下url:

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