我确定已将其发布到其他地方,但我无法找到它。我花了几个小时研究并尝试从样本代码到生成器的所有事情。我的网站目前位于名为" new"的子文件夹中。一旦准备好发布,我将把站点移动到根文件夹。该网站是数据库驱动的,现在可以访问您需要使用这样的URL的页面:
http://domain.com/new/index.php?page=about
我想拥有它,所以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 / works但是其他任何像/ new / contact-us /都不起作用。我唯一能想到的是/ home /是唯一一个没有' - '网址中的字符。我在.htaccess中遗漏了一些东西来解释这个问题吗?
答案 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
例如。