我确定这已经张贴在其他地方,但我找不到它。我花了几个小时研究并尝试了从示例代码到生成器的所有东西。我有一个网站,目前居住在一个名为"新"的子文件夹。我将把网站移动到根文件夹一旦它准备好启动。该网站是数据库驱动的,现在要访问页面,你需要使用这样的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
比如。