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