но вы можете загрузить example.com/?a=pagename
Чтобы предотвратить это, вы также необходимо внешнее перенаправление на ваш желаемый URL (перед вашей внутренней перезаписью) , Для того, чтобы предотвратить цикл перезаписи, вы можете проверить на THE_REQUEST
:
# Redirect typed URLs to the desired URLs
RewriteCond %{THE_REQUEST} \?a=([^\ ]*)
RewriteRule ^$ /page=%1? [R,L]
Задний ?
на подмене удаляет исходную строку запроса. (После того, как вы счастливы с переадресацией, изменить его на постоянной переадресации, R=301
.)
но вы можете загрузить ... example.com/page=pagename?a=pagename
Ну, это, как ожидается. Однако page=pagename
займет приоритет, и ?a=pagename
будет лишен вашей перезаписи. Однако отклонять такие запросы. то есть. Только переписать, когда нет строки запроса затем измените существующее правило с условием:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^page=([^/]*)$ /?a=$1 [L]
Это приведет к такому URL, вызвав 404.
UPDATE # 1: обрабатывать запросы для example.com/pagename
, вместо example.com/page=pagename
:
# Redirect "ugly" URLs to the desired URLs
RewriteCond %{THE_REQUEST} \?a=([^\ ]*)
RewriteRule ^$ /%1? [R,L]
# Internally rewrite the "pretty" URL to the real URL
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([^/]*)$ /?a=$1 [L]
UPDATE # 2: Более строгая версия выше. Это позволяет только "ИмяСтраницы" состоять из символов a
- z
, A
- Z
, 0
- 9
, _
и -
:
# Redirect "ugly" URLs to the desired URLs
RewriteCond %{THE_REQUEST} \?a=([\w-]*)
RewriteRule ^$ /%1? [R,L]
# Internally rewrite the "pretty" URL to the real URL
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([\w-]*)$ /?a=$1 [L]
Почему не вместо этого ваши URL-адреса структурирована: 'example.com/pagename'? 'example.com/page = pagename' на самом деле не кажется улучшением по сравнению с оригиналом? – MrWhite
Мне нужно это для цели – jimuty