Я использую 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
или же .
).
Что здесь происходит и почему?
И что еще более важно, как я могу это исправить?
Спасибо.
Это потому, что ваше правило выполняется более одного раза, так как ваш шаблон просто ^(\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>
Других решений пока нет …