【问题标题】:.htaccess mod_rewrite not working without trailing slash.htaccess mod_rewrite 在没有斜杠的情况下无法工作
【发布时间】:2015-01-13 12:12:29
【问题描述】:

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

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

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

【问题讨论】:

  • RewriteRule ^([^/]*)(?:\/)?$ /?page=$1 [L] 是你想要的。

标签: php .htaccess mod-rewrite


【解决方案1】:

您收到 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=$1 [L]

此代码在重写之前检查请求 URI 是否不是现有文件/文件夹。
您的规则只有可以在您不使尾部斜杠可选的情况下发挥作用。

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

而且这将是一个更好的主意,因为您不会有重复的内容(2 个不同的网址 - 带有/不带有斜杠 - 给出相同的内容:不好 用于搜索引擎)。

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

注意:您不需要使用 mod_rewrite

转义 /

【讨论】:

    【解决方案2】:

    斜线被转义了,所以如果你想删除尾部的斜线,你也必须删除反斜线。

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

    如果你想让斜杠可选,试试这个:

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

    【讨论】:

    • 不幸的是,这根本解决不了任何问题。你可以看看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2016-07-14
    • 2016-04-21
    相关资源
    最近更新 更多