Php mod_重写规则和html链接

Php mod_重写规则和html链接,php,html,apache,.htaccess,mod-rewrite,Php,Html,Apache,.htaccess,Mod Rewrite,我正在创建一个新网站,里面有一些php。网站基本上是这样工作的,我有/index.php?page=category\u页面。类别将是类别,页面将是子类别/实际页面。重写的规则如下所示:/category/page 我有这个: RewriteEngine On RewriteRule ^category/([^/]*)$ index.php?page=$1 [L] 但是我不知道如何区分类别和页面,有什么帮助吗? 第二件事是,在我的index.php(例如)中,我有一些来自外部文件的css: &

我正在创建一个新网站,里面有一些php。网站基本上是这样工作的,我有/index.php?page=category\u页面。类别将是类别,页面将是子类别/实际页面。重写的规则如下所示:/category/page

我有这个:

RewriteEngine On
RewriteRule ^category/([^/]*)$ index.php?page=$1 [L]
但是我不知道如何区分类别和页面,有什么帮助吗? 第二件事是,在我的index.php(例如)中,我有一些来自外部文件的css:

<link rel="stylesheet" type="text/css" href="style/style.css"/>


这不适用于重写规则,因为它尝试加载不存在/不重写的/category/page/style/style.css。我如何让它工作?我知道一个简单的修复方法是放置/style/style.css,这将从网站的根目录加载,但我目前正在从一个子目录运行网站,例如example.com/new/index.php,因此这不是一个选项。有什么帮助吗?

问题1:

您可以在正则表达式中定义多个参数,例如类别和页面(见下文)

有了这样一个广泛的重写规则,您可能希望添加一个不重写样式表、图像和其他资产的条件

我还修改了您的模式,只匹配字母、数字、连字符和下划线,这将防止在类别或页面名称中使用非标准字符

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(js|css|png|gif|jpg)$ [NC]
RewriteRule ^([\w\d\-]+)/([\w\d\-]+)/?$ index.php?category=$1&page=$2 [L]
问题2:

您正在href中使用相对url,该url将样式表的位置附加到浏览器中定义的当前位置(/category/page/)

即使服务器端正在重写该URL,浏览器也不知道该重写

如果改用绝对URL,则浏览器将定义相对于基本URL(/)的URL

试试这个:

<link rel="stylesheet" type="text/css" href="/style/style.css"/>

问题1:

您可以在正则表达式中定义多个参数,例如类别和页面(见下文)

有了这样一个广泛的重写规则,您可能希望添加一个不重写样式表、图像和其他资产的条件

我还修改了您的模式,只匹配字母、数字、连字符和下划线,这将防止在类别或页面名称中使用非标准字符

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(js|css|png|gif|jpg)$ [NC]
RewriteRule ^([\w\d\-]+)/([\w\d\-]+)/?$ index.php?category=$1&page=$2 [L]
问题2:

您正在href中使用相对url,该url将样式表的位置附加到浏览器中定义的当前位置(/category/page/)

即使服务器端正在重写该URL,浏览器也不知道该重写

如果改用绝对URL,则浏览器将定义相对于基本URL(/)的URL

试试这个:

<link rel="stylesheet" type="text/css" href="/style/style.css"/>

使用此重写规则

RewriteEngine On
RewriteRule ^(.+)/(.+)/$ index.php?page=$1_$2 [L]
使用此重写规则

RewriteEngine On
RewriteRule ^(.+)/(.+)/$ index.php?page=$1_$2 [L]

第二件事是在路径中添加一个尾随斜杠:
/style/style.css
第二件事是在路径中添加一个尾随斜杠:
/style/style.css
在这种情况下是否正确?斜杠前后不应该至少有一个字符吗
*
0或更多
请注意,并非每个共享主机都支持角色组\w和\d。因此,如果重写规则不起作用,请与本机组[A-Za-z0-9]一起尝试,谢谢!这工作做得很好!另外,这是在我的个人服务器上,所以我没有时间采样器的问题。在这种情况下正确吗?斜杠前后不应该至少有一个字符吗
*
0或更多
请注意,并非每个共享主机都支持角色组\w和\d。因此,如果重写规则不起作用,请与本机组[A-Za-z0-9]一起尝试,谢谢!这工作做得很好!而且,这是在我的个人服务器上,所以我没有时间采样器的问题