繁体   English   中英

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

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

我确定此消息已发布在其他地方,但找不到。 我花了几个小时研究和尝试从示例代码到生成器的一切。 我有一个站点当前位于名为“ new”的子文件夹中。 准备好将其启动后,我会将网站移至根文件夹。 该站点是数据库驱动的,现在访问您需要使用如下网址的页面:

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

我想要它,因此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]+ ,它一次或多次匹配三个不同的范围; 指定的范围是:
      • az匹配小写字母字符abcdefghijklmnopqrstuvwxyz
      • AZ匹配大写字母字符ABCDEFGHIJKLMNOPQRSTUVWXYZ
      • 0-9匹配数字字符0123456789
    • ]结束角色类
    • +指定字符类应匹配一次或多次
  • )结束子比赛组
  • $将匹配项锚定在字符串的末尾

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

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

有关字符类的更多信息,请参阅Wikipedia中的正则表达式条目。

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

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

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

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?page = -------

如果您只想要像contact-us这样的网址

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

举个例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM