Mod重写包括标点符号?

时间:2009-08-29 21:28:59

标签: regex mod-rewrite

我在网站上遇到了一个错误:基本上,它不允许页面名称中包含句号(句点)。我知道问题的根源在我的.htaccess文件中。

RewriteEngine on
RewriteRule ^([^/\.]+)/?$ index.php?section=$1 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?section=$1&page=$2 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?section=$1&page=$2&split=$3 [L]

这里的正则表达式与句点不匹配,如果用户试图直接访问文件,这是故意的。

以下是常见网址的一些示例。

games/Spider:+The+Secret+of+Bryce+Manor
games/Orbital
features/Interviewed:+Dennis+Sijnen+from+No+Monkeys
news/all/4

网址的split部分通常仅用于分页。 URL的page部分是我想要完整停靠的地方,例如:

games/Must.Eat.Birds

由于我不是特别擅长mod重写或正则表达式,我只是想要一个允许完全停止的解决方案。我知道这可能是一个更复杂的正则表达式,在这里我不在我的深处。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

将每个[^/\.]替换为[^/] - 这样他们就可以匹配所有不是'/'而不是'/'而不是'。'的所有内容。

如果您不想在某些位置允许点,请不要在这些位置更改旧的正则表达式。

答案 1 :(得分:2)

Simons响应将解决您的问题,只需将“页面”部分替换为[^/]而不是[^/\.] btw,您不需要在集合中转义句点。

你可能会对你的问题文本感兴趣的一点mod_rewrite魔法:这部分重写将匹配你的DocumentRoot中的任何真实文件,链接或目录 - 如果这首先发生,它将不会与你的后来匹配规则 - 因此确保/css/main.css转到真实文件。然后将其他任何内容重写并转储到index.php中。

# -s = File Exists
RewriteCond %{REQUEST_FILENAME} -s [OR]
# -l = Is a SymLink
RewriteCond %{REQUEST_FILENAME} -l [OR]
# -d = Is a Directory
RewriteCond %{REQUEST_FILENAME} -d
# if we match any of the above conditions - serve the file.
RewriteRule ^.*$ - [NC,L]

# adding your rules with the slight modifications pointed out above and by simon.
# only allows '.' in the "page" portion.
RewriteRule ^([^/.]+)/?$ index.php?section=$1 [L]
RewriteRule ^([^/.]+)/([^/]+)/?$ index.php?section=$1&page=$2 [L]
RewriteRule ^([^/.]+)/([^/]+)/([^/.]+)/?$ index.php?section=$1&page=$2&split=$3 [L]