使用.htaccess重写URL以获取多个参数

Fir*_*nas 13 .htaccess

这个问题可能是重复的.但我没有找到任何适用于我的解决方案.我想重写URL,我有一个和两个级别的参数.第一个参数是p第二个参数sp

www.domain.com/home应该指向www.domain.com/index.php?p=home 并且 www.domain.com/projects/99应该指向www.domain.com/index.php?p=projects&sp=99

我怎么办.htaccess?

目前我的htaccess如下,

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?p=$1
RewriteRule ^([^/]*)/([^/]*)\$ index.php?p=$1&sp=$2 [L]
Run Code Online (Sandbox Code Playgroud)

这个htaccess的问题是它正确指向一个级别的URL.即.,www.domain.com/home.但不是两级网址.即.www.domain.com/projects/99

ark*_*cha 37

您必须单独处理规则.规则之前的所有条件仅适用于单个规则.该规则不涉及以下规则.你试图"链接"两个规则.第二个规则永远不可能匹配,因为第一个规则是一个改变语法的全能.除此之外,您必须确保第一条规则不会捕获不需要的请求.还要考虑是否要在正则表达式中使用*+运算符.我建议您使用+运算符,以便在为"页面"或"子页面"请求空值时有明确的错误消息.

所以这可能更接近你正在寻找的东西:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?p=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ index.php?p=$1&sp=$2 [L]
Run Code Online (Sandbox Code Playgroud)

  • 这听起来像是客户端问题:您最有可能指定要加载的资源的相对路径?浏览器只知道未修改的请求URL,因此在尝试加载资源时他创建了错误的绝对URL.因此,您必须重定向浏览器而不是仅在服务器内部重写请求URL(丑陋,因为可见),或者您必须为资源创建干净的URL.通常,这是通过在服务器端脚本内部定义一个干净且完善的"基本URL"并使用它来为要加载的资源构建绝对路径来完成的. (2认同)