.htaccess внутреннее перенаправление не работает со строковым параметром

Так что я был на это часами, но не могу заставить его решить. Ничто в stackoverflow не справляется с моей проблемой. Проблема в том, что у меня есть правило перенаправления в моем .htaccess следующим образом

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

Это перенаправление работает, когда cid - это число, но когда используется строка типа "my-key" , она не работает. С ключом я должен изменить правило на это.

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [R,L]

Однако я не хочу использовать это, потому что это перенаправляет моих пользователей заметно, а URL-адрес меняется, чего я не хочу. Может кто-нибудь объяснить, почему эта вещь работает для чисел, но не для строковых параметров. Любая помощь будет оценена.

Изменить: Завершить .htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

Ответы

Ответ 1

Я попробовал локальный и обнаружил, что он работает для меня, если я положу эти два правила:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

еще до строки

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

Завершенный .htaccess файл будет:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

Во всяком случае, с (.+)/?$, конечная косая черта будет записана из группы и будет идти по параметрам cid. Если в категориях нет слэшей внутри, лучше использовать ([^/]+)/?$.

Обновить: понять, что происходит с вашими переадресациями, включить журнал (см. http://httpd.apache.org/docs/current/mod/mod_rewrite.html для этого). На моем хосте я включил mod_rewrite.c:trace3, и я получил следующий журнал error_log (просто отслеживание строк с помощью rewrite)

[Fri Aug 04 12:48:56.904099 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] strip per-dir prefix: /var/www/localhost/htdocs/wordpress/store-category/my-id -> store-category/my-id
[Fri Aug 04 12:48:56.904123 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] applying pattern '^index\\.php$' to uri 'store-category/my-id'
[Fri Aug 04 12:48:56.904129 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] strip per-dir prefix: /var/www/localhost/htdocs/wordpress/store-category/my-id -> store-category/my-id
[Fri Aug 04 12:48:56.904132 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] applying pattern '^store-category/(.+)/?$' to uri 'store-category/my-id'
[Fri Aug 04 12:48:56.904143 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] rewrite 'store-category/my-id' -> '/wordpress/store-category/?cid=my-id'
[Fri Aug 04 12:48:56.904147 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] split uri=/wordpress/store-category/?cid=my-id -> uri=/wordpress/store-category/, args=cid=my-id
[Fri Aug 04 12:48:56.904151 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] trying to replace prefix /var/www/localhost/htdocs/wordpress/ with /wordpress/
[Fri Aug 04 12:48:56.904155 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] trying to replace context docroot /var/www/localhost/htdocs with context prefix 
[Fri Aug 04 12:48:56.904158 2017] [rewrite:trace1] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] internal redirect with /wordpress/store-category/ [INTERNAL REDIRECT]

(за которым следует другая запись, когда он пытается найти документ по умолчанию index.php)

Ответ 2

Regex жадно (слева направо). Возможно, вы потянете лишние косые черты. Я считаю, что проще использовать не классы для URL-адресов (редко ".", Которые будут соответствовать всем).

RewriteRule ^store-category/([^\/]+)/?$ store-category/?cid=$1 [QSA,L]

Вы также можете упростить это, в зависимости от того, как вы хотите обрабатывать URL-адреса, которые могут быть искажены после идентификатора категории магазина.

RewriteRule ^store-category/([^\/]+) store-category/?cid=$1 [QSA,L]

EDIT: Вы правы. Я не тестировал весь htaccess. Вы указываете путь wordpress дважды в rewritebase и снова в правиле. Я обновил приведенные выше правила, а также предоставил ссылку на обновленное решение в тесте:

http://htaccess.mwl.be?share=116de701-cf8a-577c-bab5-5c357d844452

Ответ 3

Используйте это, это успешно работает для меня, я надеюсь, что это сработает для вас.

RewriteEngine on
IndexIgnore * 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|img|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L] 
RewriteRule ^wordpress/index.php/.*$ - [F,L,NC]