【问题标题】:check URL rewriting code检查 URL 重写代码
【发布时间】:2014-07-22 04:01:30
【问题描述】:

我一直在处理这个 URL 重写 .htaccess 代码,但有人说我做错了或倒退了:

RewriteEngine On

RewriteCond %{THE_REQUEST} /index\.php\?(.*)p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]
RewriteCond %{THE_REQUEST} /index\.php\?(.*)p=([^&\ ]+)&?([^\   ]*) [NC]
RewriteRule ^ /%2?%1%3 [R=301,L]

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

最终我希望用户不要看到带有查询字符串的链接,但我需要查询字符串仍然存在并且以某种方式可用,以便我可以检查 $_GET 变量的值。

换句话说,我需要这个: - domain.com/index.php?p=Home 改写为 domain.com/Home - domain.com/index.php?p=Bio 被重写为 domain.com/Bio - 当用户从主页单击指向 domain.com/index.php?p=Bio 的链接时,他们应该在浏览器的 url 栏中看到 domain.com/Bio,但我仍然应该能够回显 $_GET[' p'] 并在我登陆 Bio 页面时获取“Bio”。

有意义吗?

提前感谢您的帮助!

【问题讨论】:

  • 我了解您的要求,但您能否说明代码中第一行 RewriteCond %{THE_REQUEST} 的目的或意图是什么?
  • @anubhava 我代码中的第一个条件是确保不会重写 p=admin、p=superadmin 和 p=*******edit 的地址
  • 好的,但是(.*)p= 捕获之前是什么。请用一两个例子来说明。
  • @anubhava 在我看来 p 之前的 (.*) 是不必要的,但它是由 stackoverflow 上的其他人作为建议添加给我的

标签: php apache .htaccess mod-rewrite


【解决方案1】:

小调整,它应该可以工作。

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} index\.php\?.*(?<!\w)p=(?![^&]*(?:admin|edit))([^\s&#]+) [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=%1 [L,QSA]

【讨论】:

  • 感谢您的回复 - 不幸的是,您的代码我得到的只是一堆 404 错误
  • 这是一个改进,如果您收到 404,我们可以看到重写的 url 有什么问题。 404 表示文件不存在,所以找不到index.php... 这怎么可能?请暂时将L 更改为R,它将重定向,因此在浏览器栏中您将能够看到我们重定向到的网址,并排除可能出现的问题
  • 如果我在最后一行将 L 更改为 R,它就像没有重写规则一样工作(换句话说,我看到所有带有查询字符串的常规 url)
  • 所以,这意味着它正在重定向到正确的位置!出色的。现在,为了使重定向不可见,我们通常将R 更改为L... 但是你说L 给你一个404。我想知道为什么!你有其他可能干扰的代码吗?你确定使用Options +FollowSymLinks -MultiViews 吗?
  • 我刚刚擦除了我的缓存并打开了一个新浏览器并删除了我的 .htaccess 文件中的所有内容并添加了您的整个代码...现在我没有收到 404 但我也没有看到任何 url 重写完全发生,换句话说,我看到了带有查询字符串的旧链接
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多