.htaccess URL重写,以获取干净的用户配置文件URL

时间:2019-04-25 22:10:30

标签: php html .htaccess

我正在尝试重写用户个人资料页面的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]

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

这与您最初发布的代码非常不同。这里也没有“错误标志分隔符”,除非您的源代码中有未复制的字符?例如,如果您有[QSA, L](带空格),则将触发此类错误。

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

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

这些指令也有冲突,因为当请求.php时,第一个规则将尝试附加/username。可以通过在重写之前检查扩展名为.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,并且没有机会被搜索引擎索引。

不需要反斜杠转义正则表达式字符类中的文字点。

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

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