Мод переписать включая пунктуацию? - PullRequest
0 голосов
/ 30 августа 2009

Я столкнулся с ошибкой на моем сайте: в основном, она не позволяет именам страниц с полными остановками (точками) в них. Я знаю, корень проблемы находится в моем .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]

Здесь регулярное выражение не будет сопоставлять что-либо с точкой, это намеренно, если пользователь пытается получить прямой доступ к файлу.

Вот несколько примеров распространенных URL.

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

Часть URL split обычно используется только для нумерации страниц. Часть URL page - это то место, где я хотел бы разместить точки остановки, например:

games/Must.Eat.Birds

Поскольку я не особенно хорош в переписывании модов или регулярных выражениях, я бы просто хотел решение, позволяющее делать полные остановки. Я знаю, что это может быть более сложное регулярное выражение, и здесь я не в себе.

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 30 августа 2009

Ответ Simons решит вашу проблему, просто замените часть "page" на [^/] вместо [^/\.], что, кстати, вам не нужно избегать периодов в наборах.

Немного магии 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]
2 голосов
/ 30 августа 2009

Замените каждые [^/\.] на [^/] - таким образом, они будут соответствовать всему, что не является '/', вместо всего, что не является '/' и не '.'

Если вы не хотите разрешать точки в определенных позициях, просто не меняйте старое регулярное выражение в этих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...