.htaccess URL 重写,用于干净的用户配置文件 URL



我正在尝试重写用户配置文件页面的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 缺乏了解。

我还应该提到我有另一个重写规则来从 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]

第一个示例中的参数名称是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

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

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- 您已在第二行启用它。多视图和附加文件扩展名的指令将发生冲突。

请尝试类似以下内容的操作:

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