.htaccess mod_rewrite 没有尾部斜线就无法工作

.htaccess mod_rewrite not working without trailing slash

我刚开始使用 htaccess 和 mod_rewrite,所以我刚刚设法让我的功能正常运行,将我的 GET 页面变量重写为示例。com/page_name/

但是,这需要在它之后添加一个 /,我知道它已明确添加到重写中,但如果我删除它,则会收到 500 错误并且我尝试添加一个 ?在它之后,根据我在网上找到的资源,这将使它成为可选的,但是,它再次给我一个 500 错误,还有更好的写法吗?

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

斜杠被转义了,所以如果你想去掉尾随的斜杠,你也必须去掉反斜杠。

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

如果你想让尾部斜线可选,试试这个:

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

您收到 500 错误,因为您创建了一个无限循环。

解释:(当尾部斜杠可选时)

  • domain.com/page_name/ 被重写为 /?page=page_name
  • /?page=page_name 表示 /index.php?page=page_name
  • 但是现在你的规则也匹配index.php
  • --> 循环

要避免它,您可以改用此代码

RewriteEngine On

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

此代码在重写之前检查请求 URI 是否不存在 file/folder。
如果您不将尾部斜杠设为可选,则您的规则只能达到 的效果。

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

并且这将是一个更好的主意,因为您不会有重复的内容(2 个不同的 url -with/without 尾部斜线 - 提供相同的内容:对搜索引擎不好)。

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

注意:您不需要使用 mod_rewrite

转义 /