apache — почему значение параметра URL равно & quot; index.php & quot ;?

Я использую mod_rewrite с Apache и PHP, чтобы переписать URL-адреса для страницы.
Для одной страницы сайта я использую следующую, которая отлично работает:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(\d+)/? index.php?id=$1
</IfModule>

Однако для другой страницы сайта (с которой у меня проблемы) я использую следующее:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(\w+)/? index.php?id=$1
</IfModule>

По существу, \d изменения в \w,
По какой-то причине, для \w страница, id параметр устанавливается в index, а не фактическое значение в URL.
Если я изменю \w чтобы просто .тогда id параметр равен index.php,

Когда я смотрю на PHP $_SERVER суперглобальный, REDIRECT_QUERY_STRING параметр установлен правильно, но QUERY_STRING параметр имеет значение либо index или же index.php (в зависимости от того, использую ли я \w или же .).

Что здесь происходит и почему?
И что еще более важно, как я могу это исправить?
Спасибо.

1

Решение

Это потому, что ваше правило выполняется более одного раза, так как ваш шаблон просто ^(\w+)/? без якоря $,

Вы можете исправить это, включив RewriteCond до этого правила:

<IfModule mod_rewrite.c>
RewriteEngine On

# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)/?$ index.php?id=$1 [L,QSA]
</IfModule>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]