.htaccess mod_rewrite在没有尾部斜杠的情况下无法正常工作

时间:2015-01-13 12:12:29

标签: php .htaccess mod-rewrite

我是使用htaccess和mod_rewrite的新手,所以我刚刚设法将我的GET页面变量重写为examples.com/page_name /

然而,这需要一个/之后,我知道它被明确地添加到重写中,但是如果我删除它,那么我得到一个500错误并且我尝试添加一个?在它之后,根据我在网上找到的资源使它成为可选项,然而,它再次给我一个500错误,有没有更好的写作方式呢?

RewriteEngine On
RewriteRule ^([^/]*)\/$ /?page=$1 [L]

2 个答案:

答案 0 :(得分:3)

由于您创建了无限循环,因此出现500错误。

说明:(当斜线变为可选时)

  • domain.com/page_name/被重写为/?page=page_name
  • /?page=page_name表示/index.php?page=page_name
  • 现在您的规则也匹配index.php
  • - > LOOP

为避免这种情况,您可以使用此代码

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ /?page=$1 [L]

此代码在重写之前检查请求URI是否不是现有文件/文件夹 如果你不使尾随斜杠可选,那么你的规则可以解决 这个技巧。

RewriteRule ^([^/]+)/$ /?page=$1 [L]

这将是一个更好的主意,因为你不会有重复的内容(2个不同的网址 - 有/没有尾随斜线 - 给出相同的内容:错误对于搜索引擎)。

结论:选择一种格式,但不能同时选择两种格式。如果您选择without trailing slash格式,则可以使用我的第一部分代码(您可以删除?)。否则,您可以选择我的第二个(看起来与您的第二个几乎相同)。

注意:您不需要使用 mod_rewrite

逃离/

答案 1 :(得分:0)

斜杠是转义的,因此如果你想删除尾部斜杠,你也必须删除反斜杠。

RewriteEngine On
RewriteRule ^([^\/]*)$ /?page=$1 [L]

如果您想使尾随斜线可选,请尝试:

RewriteEngine On
RewriteRule ^([^\/]*)\/?$ /?page=$1 [L]