【问题标题】:Change Displayed URL Structure using mod_rewrite NOT Working使用 mod_rewrite 更改显示的 URL 结构不工作
【发布时间】:2011-07-28 14:35:19
【问题描述】:

我需要更改显示的客户端 URL 的结构。我不太熟练使用 .htaccess 文件的正则表达式和编码。基本上,我的结构类似于:

http://www.example.com/catalog/index.php?cat=lt&sec=lt1-1&id=nmlt10.  

我希望它在地址栏中显示为:

http://www.example.com/catalog/lt/lt1-1/nmlt10.  

这是我想出来的,但没有效果:

RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)/([^/]*)\$ /catalog/index.php?cat=$1&sec=$2&id=$3 [L]

我测试并删除了 .htaccess 文件中的任何其他规则,以确保没有任何内容被覆盖。我在共享托管 apache 服务器上,并且知道 mod_rewrite 已启用,因为我使用它将非 www 重写为 www url。我没有收到 500 条错误消息,我根本没有注意到任何变化。我不确定我在哪里出错了,所以希望有人能指出我正确的方向。

【问题讨论】:

  • 1) 这个 .htaccess 文件在哪里——哪个文件夹? 2)在你的模式中删除$之前的反斜杠。
  • .htaccess 在根文件夹中...我删除了反斜杠,但现在出现 500 错误。
  • 2) 检查 Apache 错误日志以获取确切的错误描述,因为 $ 是一个特殊字符,意思是“字符串结尾”。如果用反斜杠转义,那么它只是 $ 字符。 1)如果 .htaccess 在网站根文件夹中,则规则将不匹配 - 因为 URL 有 4 个段,而您的规则只有 3 个。

标签: .htaccess url mod-rewrite


【解决方案1】:

终于找到了一个可行的解决方案:

RewriteEngine On
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?cat=$1&sec=$2&id=$3 [QSA,L]

感谢 LazyOne 让我走上正轨的回应;但是,使用时:

RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?cat=$1&sec=$2&id=$3 [QSA,L]

我无法关注已经放置在网站上的链接,它会将不同的目录视为变量,例如,在浏览图像或文件时,例如:

folder/folder/image.png

它将获取“文件夹”-“文件夹”-和“图像”作为变量。我知道为什么会这样,如果有人有不同的解决方案或解释,请告诉我,我总是愿意学习。

【讨论】:

  • 简单(只要不使用别名/虚拟文件夹)——查看我更新的答案——它会在进行任何重写之前检查请求的 URL 是否不是文件或文件夹。 P.S.您实际上并没有解释您对该规则有什么问题 - 只是“它确实有效但不能同时有效”不利于解释 - 细节很重要。
【解决方案2】:

由于您的 .htaccess 位于网站根文件夹中,因此您应该使用以下规则:

RewriteEngine On
RewriteBase /

RewriteRule ^catalog/([^/]+)/([^/]+)/([^/]+)$ /catalog/index.php?cat=$1&sec=$2&id=$3 [QSA,L]

如果你把它放在/catalog/文件夹的.htaccess中,那么你可以从中删除catalog

RewriteEngine On

RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?cat=$1&sec=$2&id=$3 [QSA,L]

我在发布之前测试了规则——对我来说很好。


此规则(同上)将检查 URL 是否为文件或文件夹,如果不是则仅重写:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?cat=$1&sec=$2&id=$3 [QSA,L]

【讨论】:

  • 放在 /catalog/ 目录下工作;但是,它似乎会影响页面上的内容。使用此规则会影响 GET 变量,因为需要 CERTAIN 获取变量的内容不会出现在页面上。
  • QSA 标志应该将所有现有的查询参数复制到新的 URL - 检查 documentation, if necessary。你可以做什么——在L标志之后添加,R——它会做正确的重定向(浏览器中的URL更改),所以你可以看到这个URL在你的脚本中的样子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多