【问题标题】:Is there a way to change a php URL with htaccess?有没有办法用 htaccess 更改 php URL?
【发布时间】:2019-10-23 22:08:29
【问题描述】:

我正在尝试改变:

example.com/profile.php?id=abcdefgh

简单来说:

example.com/abcdefgh 

我在 StackOverflow 上搜索了这里,我知道我需要对我的 .htaccess 做一些事情,我尝试了这段代码:

RewriteEngine On

RewriteRule ^([^/]*)$ /profile.php?id=$1 [L]

但似乎没有任何变化,当键入此 URL (example.com/profile.php?id=abcdefgh) 时,它不会被重写。

附:我不知道上面的代码是否正确,我试过了,因为我从哪里得到它的地方和我的有类似的问题。

【问题讨论】:

  • "/profile.php?id=abcdefgh" - 为什么要重写该 URL?那似乎是目标 URL。 (尽管该指令应该仍然重写了 URL - 但错误地并且可能触发了重写循环?)您应该“键入”的 URL 是 /abcdefgh.htaccess 只是其中的一部分。您需要首先实际更改应用程序中的 URL。然后,您使用 .htaccess 中的 mod_rewrite 将 URL 重写为原始 URL。
  • 好的,猜你是对的。但是现在使用这段代码,输入 example.com/abcdefgh 我得到一个 404。如何更改我网站上的 URL?

标签: php .htaccess url


【解决方案1】:

这应该可行。

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ profile.php?id=$1 [QSA,L] 

【讨论】:

    【解决方案2】:

    您应该请求“漂亮”的 URL,即。 /abcdefgh.htaccess 中的 mod_rewrite 指令然后在内部将其重写为实际处理请求的“真实”URL(即/profile.php?id=$1)。该指令需要/abcdefgh 形式的 URL。但是,在其当前状态下,我应该期待一个重写循环:

    1. 请求/abcdefgh
    2. 请求被重写为/profile.php?id=abcdefgh
    3. 处理重新开始...
    4. 请求被重写为/profile.php?id=profile.php(因为正则表达式^([^/]*)$与重写后的URL的profile.php部分匹配。
    5. 转到#3

    在此示例中,您可以通过简单地使RewriteRule 模式(正则表达式)更具限制性来避免重写循环。例如。在否定字符类中包含一个点 (.)(假设您的新“漂亮”网址不包含点)。

    例如:

    RewriteRule ^([^/.]+)$ /profile.php?id=$1 [L]
    

    然后,您需要将网站上的 URL 实际更改为新的“漂亮” URL。

    但是,如果您当前收到 404,那么可能根本没有处理此指令? .htaccess 文件是否启用?您的.htaccess 文件中有其他指令吗?

    更新: id 中唯一允许的字符是 A-Z

    在这种情况下,您应该更具体地使用正则表达式并仅匹配所需的字符。这有助于避免冲突并避免(在某种程度上)文件系统检查的需要 - 这是相对“昂贵的”。但是请注意,您已声明“A-Z”,但您的示例包含小写字母。为了论证,我假设id 可以包含 a-z 和 A-Z。

    所以,现在变成了:

    RewriteRule ^([a-z]+)$ /profile.php?id=$1 [NC,L]
    

    不需要其他文件系统检查(在RewriteCond 指令之前)。 NC (nocase) 使正则表达式匹配不区分大小写。

    无需检查请求是否未映射到文件(带有前面的条件),因为正则表达式 ^([a-z]+)$ 永远无法匹配文件(包括文件扩展名)。

    也不需要检查请求是否映射到目录,除非您直接请求文档根目录中的目录 - 这可能是“不太可能”。但是,其中存在与此 URL 结构的内在冲突。如果您需要能够访问一个目录,那么这些目录名称将成为无效的 ID - 因此您需要在系统的其他地方进行其他检查,以确保没有生成映射到文档根目录中的物理目录的 ID。

    【讨论】:

    • 是的,id 中唯一允许的字符是 A-Z
    • 在这种情况下,RewriteRule pattern 应该更加具体。此外,不需要额外的文件系统检查(在RewriteCond 指令之前) - 如@NurulAlam 的回答所述。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多