【问题标题】:.htaccess - clean urls with different parameters.htaccess - 使用不同参数清理 url
【发布时间】:2016-12-01 22:03:27
【问题描述】:

有没有办法让它工作?

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

网址应如下所示:

http://test.com/a/b
or
http://test.com/a/c

它只适用于第一条规则。

就我而言,我正在尝试创建个人资料页面并通过会话 ID 或通过 $_GET['id'] 获取 ID。

因此,如果我访问其他人的个人资料,则 url 是

index.php?page=profile&id=25
/profile/25

如果我访问的是我自己的个人资料

index.php?page=profile
/profile

例如,我想编辑我的个人资料

index.php?page=profile&action=edit
/profile/edit

我希望你明白我的意思并能帮助我。

【问题讨论】:

  • 我不确定您的两个 URL 之间有什么区别,即应该使用 a= 重定向一个?和 b =?另一个应该是 a=?和 c=?.
  • 但这只是行不通,因为它总是试图到达 test.com/post/25
  • 如果参数是这样的:test.com/index.php?page=post&action=edit 或 test.com/index.php?page=post&id=25
  • 你能用更多的例子来更新这个问题吗?我想我开始明白你想要做什么了。 /post/edit 可能需要更改为 /post/25/edit 才能工作(否则我们怎么知道 ID?)

标签: .htaccess clean-urls


【解决方案1】:

解决此问题的关键是注意您要传递的每个参数之间的差异。

  • 如果访问者正在查看其他人的个人资料,则会传递一个 id(数字)。
  • 如果访问者正在编辑他们的个人资料,则会传递一个参数字符串(字母数字)
  • 如果访问者正在查看自己的个人资料或其他通用页面,则不会传递额外参数

.htaccess 规则最容易从最具体到最一般的写出来,所以翻译一下,规则就变成了

RewriteRule ^([^/]+)/([0-9]+)$ index.php?page=$1&id=$2 [L]
RewriteRule ^([^/]+)/([a-z0-9]+)$ index.php?page=$1&action=$2 [NC,L]
RewriteRule ^([^/]+)$ index.php?page=$1 [L]

跳过现有的文件和目录也很重要,但是因为 RewriteCond 语句只匹配下一个 RewriteRule,所以最简单的方法是用一种稍微不同的方式来执行此操作。

RewriteEngine On

# If the file or directory exists, exit
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .? - [END]

RewriteRule ^([^/]+)/([0-9]+)$ index.php?page=$1&id=$2 [L]
RewriteRule ^([^/]+)/([a-z0-9]+)$ index.php?page=$1&action=$2 [NC,L]
RewriteRule ^([^/]+)$ index.php?page=$1 [L]

【讨论】:

  • 非常感谢您的回答!我要在星期一试试这个。周末愉快!
  • 非常感谢,它有效!非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 2014-06-22
相关资源
最近更新 更多