【问题标题】:.htaccess Pretty URL not displaying correctly with redirection.htaccess 漂亮的 URL 无法通过重定向正确显示
【发布时间】:2013-04-02 20:54:07
【问题描述】:

我正在尝试使用 mod_rewrite 在我的 .htaccess 文件中配置动态 mod 重写规则。我非常接近弄清楚这一点。我正在尝试获取这样的 URL:

http://www.mysite.com/index.php?service=14&title=events
http://www.mysite.com/index.php?service=48&title=planning

要自动重写为这些:

http://www.mysite.com/service/14/events
http://www.mysite.com/service/48/planning

到目前为止,这是我的代码:

RewriteRule ^service/(.*)/(.*)$ index.php?service=$1&title=$2 [NC,L]
RewriteCond %{QUERY_STRING} ^service=$1&title=$2 [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index.php [NC]
RewriteRule ^index.php$ /service/$1/$2 [L,R=301]

我认为最后一行可能有问题?我不是最擅长正则表达式,所以任何帮助将不胜感激。 编辑:只是想清楚漂亮的 URL 确实有效。但是,旧 URL 不会重定向,并且仍在浏览器中显示。

我不确定这是否会更容易,但如果我能让 URL 看起来像这样:

http://www.mysite.com/service/14/title/events
http://www.mysite.com/service/48/title/planning

那也行。我真的不需要将第二个查询标题放在 URL 中,但如果将其留在 URL 中更容易,那就没什么大不了的。

编辑:已回答 非常感谢所有为解决方案做出贡献的人。我的重写规则得到了这个:

RewriteRule ^index/service/(.*)/(.*)/$ index.php?service=$1&title=$2

一旦我添加了“索引”,它就可以同时处理两个查询字符串。就重定向而言,我编辑了我的 php 脚本并在那里进行了所有 URL 重定向,这要容易得多。特别感谢 mkjasinski 指出这一点。

【问题讨论】:

  • 您遇到错误了吗?
  • 不。没有错误。漂亮的 URL 可以工作,但旧的 URL 不会重定向到它们。导航到旧 URL 时会显示该页面,但浏览器不会重定向到漂亮的 URL。

标签: regex .htaccess mod-rewrite


【解决方案1】:

试试这个:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^service/([0-9]+?)?/([a-zA-Z\-]+?)$ index.php?service=$1&title=$2 [L,NC]

如果我跑过:http://localhost/service/12/This-is-text in $_GET in index.php:

array (size=2)
  'service' => string '12' (length=2)
  'title' => string 'This-is-text' (length=12)

【讨论】:

  • 感谢您的回复。我试过你的代码,就像我的一样,漂亮的 URL 可以工作。但是,当我尝试使用旧 URL 导航到页面时,它不会重定向到新的漂亮 URL。抱歉,我可能应该更清楚。
  • @kyzer1978 链接必须建立在应用程序的一侧,如果您想重定向任何链接,那么您将收到 2x 请求。
  • 我实际上才意识到这一点。我可能会在我的应用程序中重写代码。太糟糕了,这将是大量的工作!
【解决方案2】:

您不能将以前重写规则中的特殊持有者 ($1,$2...) 用于 rewritecond。

将您的代码更改为:

RewriteRule ^service/(.*)/(.*)$ index.php?service=$1&title=$2 [NC,L]

RewriteCond %{QUERY_STRING}  (?:^|&)service=([0-9]+)(&|$) [NC]
RewriteCond %{QUERY_STRING}  (?:^|&)title=([a-z]+)(&|$) [NC]   
RewriteRule ^index.php$ /service/%1/%3? [L,R=301]

【讨论】:

  • 我想我们快到了。旧的 URL 正在重定向,但现在它们会转到错误的漂亮 url。他们都在这里重定向:http://www.mysite.com/service// 查询字符串没有转移到新的 URL。
  • 现在越来越近了。第二个查询字符串在重写中保留,但不是第一个。我得到了这个http://www.mysite.com/service/events 或这个http://www.mysite.com/service/planning 第一个查询值仍然没有传递到新的URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2011-07-31
  • 2015-10-04
相关资源
最近更新 更多