【问题标题】:Rewrite URL with .htaccess for multiple parameters使用 .htaccess 为多个参数重写 URL
【发布时间】:2013-02-09 08:38:56
【问题描述】:

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

www.domain.com/home 应该指向www.domain.com/index.php?p=homewww.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]

这个 htaccess 的问题在于它正确地指向了一级 url。即,www.domain.com/home。但不是两级网址。 IE。 www.domain.com/projects/99

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    您必须单独对待规则。规则之前的所有条件仅适用于单个规则。后续规则及其条件不涉及后续规则。您试图“链接”两条规则。第二条规则永远无法匹配,因为第一条规则是一个包罗万象的规则,它改变了语法。除此之外,您必须确保第一条规则不会捕获不需要的请求。还要考虑是否要在模式中使用*+ 运算符。我建议您使用+ 运算符,以便在为“页面”或“子页面”请求空值时获得清晰的错误消息。

    所以这可能更接近您正在寻找的内容:

    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]
    

    【讨论】:

    • 非常感谢。经过上述更改后,它工作正常。但是当我转到二级 URL 时,我的 javascript src、css 链接和 img 源等引用是错误的。它从第二级 url 中查找这些文件。我该如何解决这个问题?
    • 这听起来像是一个客户端问题:很可能您为这些资源指定了加载的相对路径?浏览器只知道未修改的请求 url,因此在尝试加载资源时会创建错误的绝对 url。因此,要么您必须重定向浏览器,而不仅仅是在服务器内部重写请求 url(丑陋,因为可见),或者您必须为资源创建干净的 url。通常这是通过在服务器端脚本中定义一个干净且合理的“基本 url”来完成的,并使用它来构建要加载的资源的绝对路径。
    • 是的,这是因为相对路径。我已经通过指定从根目录的完整路径解决了这个问题。
    • 当然,这是可能的,一个快速简单的解决方案。但是,这会使您的应用程序绑定到某个位置。尝试使用您在中心位置设置的正式“基本 URL”或“安装路径”。这使您的应用程序具有可移植性。
    • 如果 index.php 文件是您应用程序中的唯一控制器,那么是的,那应该没问题。大多数项目面临的问题是这种碱基的自动检测并不总是可能的。这就是为什么许多项目/应用程序允许在其配置中手动定义基础。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2013-03-05
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多