Php .htaccess URL重写用于清除用户配置文件URL

Php .htaccess URL重写用于清除用户配置文件URL,php,html,.htaccess,Php,Html,.htaccess,我正在尝试重写用户配置文件页面的URL,使其更干净 https://example.com/user/profile.php?user=username 到 我四处寻找解决方案,并阅读了一些文档,但我不太明白如何正确使用它 我的.htaccess中有此代码 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ user/profile.php?username=$1 [QSA,L] 当我运行这段代码时,

我正在尝试重写用户配置文件页面的URL,使其更干净

https://example.com/user/profile.php?user=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
完全访问:

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]
这与您最初发布的代码非常不同。这里也没有“坏标志分隔符”,除非源代码中有一个字符没有被复制?例如,如果您有
[QSA,L]
(带有空格),则会触发此类错误

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

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

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

您还需要禁用“多视图”——您已经在第二行启用了它。“多视图”与追加文件扩展名的指令将发生冲突

请尝试以下方法:

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

您在第一个示例中的参数名为
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
选项+索引
选项+多视图
范欣德兴指数
IndexIgnore*
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D

RewriteRule^(.*)$user/profile?user=$1[QSA,L]#可能与“我有另一个RewriteRule要删除.php扩展名”重复-可能存在冲突。这可能会导致重写循环(在浏览器中显示为500错误)。请包括
.htaccess
文件的全部内容。顺便说一句,如果出现500错误,您应该查看服务器错误日志以了解此错误的详细信息。@MrWhite我用输出日志错误更新了我的问题,以及.htaccess的其余部分。谢谢。搜索类似的案例。无法从文本副本复制并粘贴到此处。//不管怎么说,这两条规则几乎不兼容。
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]
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