Я работаю над проектом сайта, www.experimonkey.com. В каталоге root у меня есть каталоги для экспериментов, игр и т. Д. c., Которые я динамически обслуживаю с php. Я хочу очистить URL-адреса, чтобы вместо /experiments?eid=homemade-lava-lamp
, например, пользователь мог от go до /experiments/homemade-lava-lamp
. Я также хотел бы иметь перенаправление, чтобы, если пользователь перейдет на старую ссылку, /experiments?eid=homemade-lava-lamp
, он будет перенаправлен на чистую ссылку.
Я думал, что понял первую часть проблема со следующим кодом в /experiments/.htaccess
:
RewriteEngine On
RewriteRule ^([a-zA-Z0-9\-]+)/?$ index.php?eid=$1 [L]
Это работает для динамических c страниц; однако позже я понял, что это испортит другие настоящие каталоги в папке /experiments
. Например, адрес /experiments/submit
(который на самом деле /experiments/submit/index.php
) перенаправляет на /experiments/submit?eid=submit
- почему, я понятия не имею.
Но также, независимо от того, какие комбинации следующего кода я пробовал ( и все остальные темы и документацию, которые я прочитал), я не смог заставить старый URL перенаправить на чистый URL:
RewriteCond %{QUERY_STRING} eid=(.+)
RewriteRule .+ https://www.experimonkey.com/experiments/%1 [R=301]
RewriteEngine при
Редактировать (почти работает)
Я дошел до этого далеко. Сейчас все в основном работает, кроме двух последних частей, создающих бесконечное число l oop, и я не уверен, как это исправить.
#Ignore existing directories and files unless has query string
RewriteCond %{QUERY_STRING} !eid=(.*)
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
#Redirect and remove query string
RewriteCond %{QUERY_STRING} /?eid=(.*)
RewriteRule (.*) https://www.experimonkey.com/experiments/%1? [R=301,L]
#Rewrite internally to actual URL
RewriteRule ^([a-zA-Z0-9\-]+)/?$ index.php?eid=$1 [L]