1

我的 Apache 上有一个 RewriteRule 以使 URL 友好

RewriteRule ^log/(.+)$ script.php?u=$1 [QSA] 

这使得http://example.com/log/username在内部被重定向到http://example.com/script.php?u=username

只要用户名不包含尾随句点,这就可以正常工作。但是,有些用户名是人们选择“firstname-L”之类的名称。(注意尾随时间)

在这种情况下http://example.com/firstname-L。被翻译成http://example.com/script.php?u=firstname-L(尾随句号消失了)

我怎样才能让它工作?

4

2 回答 2

1

您可以尝试检查这些配置指令:

RewriteCond %{REQUEST_URI} !^/log/(.+)\.$
RewriteRule ^log/(.+)$ /script.php?u=$1 [QSA]

RewriteCond %{REQUEST_URI} ^/log/(.+)\.$
RewriteRule ^log/(.+)$ /script.php?u=$1. [QSA]

或者:

RewriteCond %{REQUEST_URI} ^/log/(.+)([a-zA-Z0-9_-]{1})$
RewriteRule ^log/(.+)$ /script.php?u=$1 [QSA]

RewriteCond %{REQUEST_URI} ^/log/(.+)\.$
RewriteRule ^log/(.+)$ /script.php?u=$1. [QSA]

我希望,我没有弄错.. 现在,由于带有一个字符或一个带有尾随句点的字符的用户名变量在第二个代码中不起作用,我们可以尝试用这个替换第二个代码:

RewriteCond %{REQUEST_URI} ^/log/(.*)([a-zA-Z0-9_-]{1})$
RewriteRule ^log/(.+)$ /script.php?u=$1 [QSA]

RewriteCond %{REQUEST_URI} ^/log/(.*)\.$
RewriteRule ^log/(.*)$ /script.php?u=$1. [QSA]

或者,如果您不喜欢四个班轮,您可以尝试这三个班轮指令:

RewriteCond %{REQUEST_URI} ^/log/(.*)\.$
RewriteRule ^log/(.*)$ /script.php?u=$1. [QSA]
RewriteRule ^log/(.*)([a-zA-Z0-9_-]{1})$ /script.php?u=$1$2 [QSA]

我希望,上面的所有这些代码都能正常工作!

于 2013-05-05T10:26:54.530 回答
0

?=xxxxxxxxx您的规则似乎是正确的,也许客户端或服务器正在将最后一个点剥离为虚假(使用 Chrome 在 YT 上进行检查,如果您在视频网址( to )的末尾添加一个点?=xxxxxxxxx.并按 Enter 键,它将被删除 -实际上触发了 303 HTTP 响应)。

通常,您应该在 url 中仅使用大写/小写字母和非尾随破折号或圆点来组成所谓的 slug,保证在所有体面的浏览器和 Web 服务器上都能正确处理。

于 2013-05-05T10:02:40.227 回答