【问题标题】:Mod_Rewrite for URL用于 URL 的 Mod_Rewrite
【发布时间】:2013-04-06 12:25:17
【问题描述】:

几天来我一直在研究问题和答案,试图弄清楚如何完成这项工作。

到目前为止,我可以更改我的 URL,但它不会加载页面。

我必须接受

http://www.mysite.com/index.php?mode=about

让它显示为

http://www.mysite.com/about/

到目前为止,我有以下代码:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^mode=(.*)
RewriteRule ^ http\:\/\/\www.mysite.com\/%1? [R=301,L]

RewriteRule /(.*) /index.php?mode=%1 [L]

我已经改变了很多次,但什么都没有。大多数网站似乎都告诉我我不需要 301 重定向,但是我什么也做不了。

【问题讨论】:

  • 所以 URL 确实发生了变化(表明您的重写正在工作)但是当您最终到达 /about/ 时,页面 index.php?mode=about 没有加载?或者您是否需要修复重写以便正确路由到/about/
  • 是的,这是正确的。我的页面错误提示“找不到页面”,但它确实显示了我希望在地址栏中显示的正确信息
  • 我说如果你只离开 RewriteEngine onRewriteRule /(.*) /index.php?mode=%1 [L] 并摆脱其余的,它应该可以工作。
  • 我已经尝试过了,这似乎是大多数网站所说的,但是当我取出其他部分时,没有任何效果。
  • 刚刚再次尝试确认。当我删除这两行时,网站的工作方式就像没有代码一样。

标签: mod-rewrite


【解决方案1】:

对于(您的)示例,一旦您正确地从 mysite.com/index.php?mode=about 路由到 mysite.com/about,它现在将查看 mysite.com/about/ 以查找接下来会发生什么(index.py/index.html/etc)。

因为/about/ 没有任何内容,所以您会收到 404 错误。

我不认为你可以使用 mod_rewrite 来完成你想要实现的目标,除非你在 /about/ 中进行一些处理,以便在你到达那里后实际显示你想要的页面。

http://www.noupe.com/php/10-mod_rewrite-rules-you-should-know.html

记住文件系统总是优先的

您服务器上的文件系统将始终优先于 重写网址。例如,如果您有一个名为“服务”的目录 在那个目录中有一个名为“design.html”的文件,你不能 将 URL 重定向到“http://domain.com/services”。发生的事情是 Apache 进入“服务”目录并没有看到 重写指令。

要解决此问题,只需重命名您的目录(在 开始或结束是一种简单的方法)。

【讨论】:

  • 我不确定我是否遵循。我应该用下划线重命名哪个目录?是在名字之前还是之后?
【解决方案2】:

我必须接受

http://www.mysite.com/index.php?mode=about

并让它显示为

http://www.mysite.com/about/

人们想要两种非常常见的规则类型,您的陈述可以用两种需要不同规则的方式来解释。我将解释您的声明,即您在http://www.mysite.com/index.php?mode=about 有一个真实的、可操作的脚本,但是您不想让用户输入那个“丑陋”的 URL,而是希望他们在输入 http://www.mysite.com/about/ 时得到那个 URL。为此,您需要执行以下操作:

RewriteRule ^about/?$ /index.php?mode=about [L]

由于可能产生误解,最好将您想要的内容表述为 (1) 用户将在浏览器中输入的内容以及 (2) 您想要为他们提供的真实文件。

【讨论】:

  • 当我使用你的建议时没有任何反应。我的网站就像代码不存在一样。
【解决方案3】:

我认为您不需要第 2 行和第 3 行,并且您似乎有 % 而不是 $,试试:

RewriteEngine on
RewriteRule ^([^\/]+) /index.php?mode=$1 [L]

【讨论】:

  • 内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。请联系服务器管理员 webmaster@mysite.com 并告知他们错误发生的时间,以及您所做的任何可能导致错误的事情。服务器错误日志中可能提供有关此错误的更多信息。此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。
  • @Ni Ck,在底部用另一个版本更新了答案;)
  • 我在尝试加载网站时又遇到内部服务器错误。
【解决方案4】:

解决了这个问题。感谢大家的帮助。


#

# RewriteEngine on

# RewriteCond %{REQUEST_FILENAME} !-f

# RewriteCond %{REQUEST_FILENAME} !-d

#

选项 +FollowSymLinks

重写引擎开启

重写规则 ^([a-zA-Z0-9_-]+)$ index.php?mode=$1

重写规则 ^([a-zA-Z0-9_-]+)/$ index.php?mode=$1

【讨论】:

  • 我明白了。尽管此站点上可能有大量类似的答案,但我建议将此答案标记为已接受,以便其他人看到正确的答案。您还可以通过添加将您的 2 行合二为一?在右括号之后并可能添加 QUERY_STRING(例如:RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?mode=$1&%{QUERY_STRING}),因此如果您想在新 URL 后添加额外的变量,则不会丢失它,例如 /about/?anotherVar=extraindex.php?mode=about&anotherVar=extra 相同。
  • 这很好。谢谢。它不会让我在明天之前检查它。
  • 如何获取第二个变量并将其屏蔽?所以我没有/about/?anotherVar=extra 我有/about/extra。第二个变量将在某些页面上不是全部
  • ^([a-zA-Z0-9_-]+)(/([a-zA-Z0-9_-]+))?/?$ index.php?mode=$1&anotherVar=$3&%{QUERY_STRING}
  • 我应该更清楚一点。它可以工作并加载我的页面,但我丢失了部分页面。我在索引页面上使用了 并且 mode 变量将内容信息加载到 template.php 中。当我将 /oliveOil 添加到 URL 时,它会加载正确的页面,但不会加载 template.php。有没有解决方案,还是我必须坚持在 URL 中使用 /products?productContent=oliveOil?
【解决方案5】:

你可以用这个:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME}  -d
RewriteRule  ^.*$  -  [L]

RewriteRule ^([^/]+)/$  /index.php?mode=$1 [L]

开头仍然允许访问其他文件夹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多