我在网站上遇到了一个错误:基本上,它不允许页面名称中包含句号(句点)。我知道问题的根源在我的.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重写或正则表达式,我只是想要一个允许完全停止的解决方案。我知道这可能是一个更复杂的正则表达式,在这里我不在我的深处。
感谢您的帮助。
答案 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]