【问题标题】:page is displaying error page instead of intended page页面显示错误页面而不是预期页面
【发布时间】:2013-05-03 20:35:33
【问题描述】:

这段代码真的让我很困惑,为什么会这样。如果我添加 [R=302,L] 然后我的链接就像我希望的那样完美。但如果我不添加它而我只有 [L] 它进入错误页面。 R和no R的区别不就是浏览器的地址栏有没有更新吗?

这是代码中的最后一行。我正在尝试进行内部/静默 mod_rewrite

我想要用户输入http://example.com 还是http://example.com/home/

我想要内部相同的网址http://example.com/home

# Do not remove this line, otherwise mod_rewrite rules will stop working

RewriteBase /

AddHandler application/x-httpd-php .css

AddHandler application/x-httpd-php .js
Options +Multiviews

RewriteEngine On

#NC not case sensitive
#L last rule don't process futher
#R 301 changes the url to what you want


#changes the host to make sure it has no www infront
RewriteCond %{HTTP_HOST} !^example\.host56\.com 
RewriteRule ^(.*)$ http://example.host56.com [R=302,L]


#kills request with file extensions
RewriteCond %{THE_REQUEST} \.(php|jsp|html|jsp|asp)/?\ HTTP/
RewriteRule .* - [F]

#selects home
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\ HTTP/1.1$
RewriteRule ^.*$ home/ [L]

【问题讨论】:

  • 那么是否有 /home/index.php 或 /home/index.html 文件实际处理请求?
  • 它是 /home/index.php 并不重要。它应该会自动查找索引文件

标签: apache url mod-rewrite rewrite


【解决方案1】:

通过传递R=*** 标志,您将强制浏览器在新 URL 上实际向服务器发出新请求。在后续请求中,由于主机名已经是您想要的,这显然会在下一个请求中跳过此条件并继续执行其余的 htaccess 逻辑。

如果您删除它并仅保留 L 标志。您指出这是您应该处理的 htaccess 中的最后一条规则,因此文件中的以下规则将永远不会被执行(我猜这会导致您出现错误页面)。

【讨论】:

  • 之后没有更多的规则。我删除了 [L] 但我仍然得到同样的错误。我认为 R 只在浏览器中有所不同,它会更新,但在内部我仍然应该提供相同的内容
  • @Lpc_dark No. R=*** 导致外部浏览器重定向。它将对该服务器发出第二个请求。你不能在不触发页面重新加载的情况下更改浏览器中的 URL,因为这将是一个可怕的安全漏洞(任何人都可以将他们的网站钓鱼成谷歌、亚马逊或其他网站)。后面没有规则是什么意思? [R=302,L] 之后有两条规则,可能它们只是没有被触发。
  • 不,我说的是最后一条规则。我知道第一个有效,第二个也有效,第三个规则就是我所说的。我知道代表重定向的 R 发送 301(永久)或 302(临时)并且我知道浏览器重新加载。我说的是最后一条规则,为什么 R 会加载页面,而没有 R 则不会。都在同一个域中
  • @Lpc_dark 因为R 标志强制重新加载。 R 标志进行外部重定向,更改浏览器中的 URL。您正在更改浏览器中的 URL,因此必须重新加载。
  • K 所以没有 R 标志它不应该重定向但浏览器仍然应该显示相同的东西?只是它不会显示重定向?
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2023-03-04
  • 2019-12-09
相关资源
最近更新 更多