【问题标题】:.htaccess URL rewriting for clean user profile urls.htaccess 为干净的用户配置文件 URL 重写 URL
【发布时间】:2019-04-25 22:10:29
【问题描述】:

我正在尝试重写用户个人资料页面的 URL 以使其更简洁。

https://example.com/user/profile.php?user=username

https://example.com/username

我已经四处寻找解决方案并阅读了一些文档,但我无法弄清楚如何正确解决。

我的 .htaccess 中有这段代码

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ user/profile.php?username=$1 [QSA,L]

当我运行此代码时,我每次都会收到内部服务器错误,但我通过 htaccesscheck.com 运行我的代码,它说我的语法一切正常。所以我猜测我的问题源于我对 htaccess 缺乏了解。

我还应该提到我有另一个 RewriteRule 可以从 URL 中删除 .php 扩展名。不确定这是否会影响任何事情,但如果会影响的话,我可以跟进我的整个 .htaccess 文件。



编辑:

我确实检查了错误日志,我想我应该在一开始就把它放在这里,我的错。它输出了这个:

RewriteRule: bad flag delimiters

完整的.htaccess:

Options +Indexes
Options +MultiViews
IndexOptions FancyIndexing
IndexIgnore *


RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^(.*)$ user/profile?username=$1 [QSA,L]

【问题讨论】:

  • “我有另一个 RewriteRule 来删除 .php 扩展名” - 你可能有冲突。这可能会导致重写循环(这将在浏览器中显示为 500 错误)。请包含您的.htaccess 文件的全部内容。顺便说一句,如果您收到 500 错误,您应该查看服务器错误日志以了解此错误的详细信息。
  • @MrWhite 我用输出日志错误和我的 .htaccess 的其余部分更新了我的问题。谢谢。
  • 搜索RewriteRule: bad flag delimiters 寻找类似案例。无法从文本复制和粘贴到此处重现。 // 无论如何,这两个规则几乎不兼容。

标签: php html .htaccess


【解决方案1】:

您在第一个示例中的参数名称是user,然后您设置为username

Options +Indexes
Options +MultiViews
IndexOptions FancyIndexing
IndexIgnore *

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ user/profile?user=$1 [QSA,L] # <<< see this line
RewriteRule ^([^\.]+)$ $1.php [NC,L] # <<< this should be the last line in rules

此外,您的网络服务器中是否启用了mod_rewrite 模块?

【讨论】:

    【解决方案2】:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]
    RewriteRule ^(.*)$ user/profile?username=$1 [QSA,L]
    

    这与您最初发布的代码非常不同。这里也没有“坏标志分隔符”,除非你的源代码中有一个字符没有被复制?例如,如果您有 [QSA, L](带有空格),那么就会触发这样的错误。

    您还将 URL 参数名称从 user 更改为 username

    但是,此代码肯定会触发重写循环,因为最后一个 RewriteRule 无条件执行并适用于所有内容RewriteCond 指令(检查请求是否映射到文件)仅适用于后面的单个 RewriteRule

    这些指令也有冲突,因为第一条规则会在请求/username 时尝试附加.php。这可以通过在重写之前检查具有.php 扩展名的文件是否存在来避免。 (除非您可以对 URL 路径使用更严格的模式 - 这会更可取 - 因为文件系统检查相对昂贵。)

    您还需要禁用MultiViews - 您已在第二行启用它。 MultiViews 和您附加文件扩展名的指令会发生冲突。

    请尝试以下方法:

    Options -Indexes -MultiViews
    
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
    RewriteRule ^([^.]+)$ $1.php [NC,L]
    
    RewriteRule ^([^/.]+)$ user/profile.php?username=$1 [QSA,L]
    

    除非您有特定要求在查看目录时显示空目录列表,否则只需完全禁用目录索引(如上所述)。然后用户得到一个 403 并且没有机会被搜索引擎索引。

    没有必要在正则表达式字符类中使用反斜杠转义文字点。

    ^([^/.]+)$ 是一种限制性更强的模式,可以避免重写循环。您之前的模式匹配一切,并且由于没有文件系统检查,它会重写重写等。

    您应该重写到实际文件,即。 profile.php(就像您在第一个示例中所做的那样),而是依赖另一个指令来附加 .php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多