Вот моя конфигурация каталога Apache 2:
<Directory /var/www/html/website/>
Options +SymLinksIfOwnerMatch
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?operator=$1&url=$2 [L,QSA]
RewriteRule ^([^/]+)/?$ index.php?operator=$1 [L,QSA]
</Directory>
Если я войду http://example.com/website/a/b тогда я вижу: ?operator=a&url=b
, Это нормально и это то, что я ожидаю.
Если я войду http://example.com/website/a/ тогда я вижу: ?operator=a&url=
, Это тоже нормально и ожидаемо.
Моя проблема является результатом http://example.com/website/. Что я вижу ?operator=index.php&url=
,
Я ожидал увидеть оба параметра пустыми, но оператор заполняется с помощью «index.php».
Как я могу изменить мой ‘RewriteRule’, чтобы оба параметра были пустыми, когда нет никаких каталогов, тянущихся после веб-сайта, как показано в моем примере?
Это потому, что правило перезаписи выполняется дважды, потому что RewriteCond
применяется к следующей немедленной RewriteRule
,
Измените свои правила на:
<Directory /var/www/html/website/>
Options +SymLinksIfOwnerMatch
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?operator=$1&url=$2 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ index.php?operator=$1 [L,QSA]
</Directory>
Других решений пока нет …