RewriteRules в htaccess для чистого разрешения URL и перенаправления с полного URL на чистый URL - PullRequest
0 голосов
/ 08 марта 2020

Я работаю над проектом сайта, 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]

1 Ответ

0 голосов
/ 10 марта 2020

Я наконец понял это - я надеюсь, что это может помочь кому-то где-то по пути (я, честно говоря, не могу поверить, сколько времени мне понадобилось, чтобы выяснить).

#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. 
#First line was the crucial condition to stop loop by checking for internal redirect first.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
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]
...