[英]rewrite URL from /index.php?page=about to /page/
我确定此消息已发布在其他地方,但找不到。 我花了几个小时研究和尝试从示例代码到生成器的一切。 我有一个站点当前位于名为“ new”的子文件夹中。 准备好将其启动后,我会将网站移至根文件夹。 该站点是数据库驱动的,现在访问您需要使用如下网址的页面:
http://domain.com/new/index.php?page=关于
我想要它,因此URL看起来像这样:
我尝试了很多不同的事情,但我不知道从哪里开始。 这是我使用的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.