mod_rewrite,在URL中有尾随句点

时间:2013-05-05 09:54:31

标签: mod-rewrite

我在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(尾随时期已经过去)

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

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

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

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

OR:

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]

我希望,以上所有这些代码都能正常运作!

答案 1 :(得分:0)

您的规则似乎是正确的,也许客户端或服务器正在将最后一个点剥离为虚假(如果您在视频网址的末尾添加一个点(?=xxxxxxxxx到{{ 1}})然后按回车键,它会被删除 - 实际上会触发303 HTTP响应。)

一般情况下,你应该只在网址中使用大写/小写字母和非尾随破折号或点来组成所谓的slug,这可以保证在所有不错的浏览器和Web服务器上正确处理。

相关问题