Странное поведение с .htaccess - PullRequest
1 голос
/ 07 октября 2019

Я новичок в правиле перезаписи, и у меня возникла небольшая проблема с моим .htaccess

RewriteEngine On
RewriteRule ^toto\.html$ /toto.php [NC,L]
RewriteCond %{REQUEST_URI} !^/(my|your)/template\.html [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/example\.html [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /$1.php?type=$2&name=$3 [NC,L]
RewriteRule ^([^/]*)/([^\.]*)\.html$ /index.php?type=$1&name=$2 [L]
RedirectMatch 404 \.(htaccess|htpasswd|ini|log|sh|inc|bak|bkp|sql|json)$

Я проверил его на https://htaccess.madewithlove.be/, что всегда дает мне правильное переписывание.

Когда я проверяю это на своем веб-хостинге:

Я перехожу на http://mydomain.ovh/my/object.html

Перезапись вправо : http://mydomain.ovh/index.php?type=my&name=object

Нокогда я иду к

Переписано неправильно : запрошенный URL /redirect:.php не был найден на этом сервере.

Я не понимаю этого поведения...

Итак, я протестировал новые правила перезаписи, создав общий сценарий для действия записи / заполнения:

RewriteEngine On
RewriteRule ^toto\.html$ /toto.php [NC,L]
RewriteCond %{REQUEST_URI} ^/extract/(my|your)/[^\.]+\.html$ [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /extract.php?type=$2&name=$3 [L]
RewriteCond %{REQUEST_URI} !^/extract.* [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/template\.html [NC]
RewriteCond %{REQUEST_URI} !^/(my|your)/example\.html [NC]
RewriteRule ^([^/]*)/([^/]*)/([^\.]*)\.html$ /set.php?type=$2&name=$3 [NC,L]
RewriteRule ^([^/]*)/([^\.]*)\.html$ /index.php?type=$1&name=$2 [L]
RedirectMatch 404 \.(htaccess|htpasswd|ini|log|sh|inc|bak|bkp|sql|json)$

Я протестировал его на https://htaccess.madewithlove.be/, что всегда дает мне правопереписать.

И когда я проверяю его на своем веб-хостинге:

я перехожу к http://mydomain.ovh/my/object.html

Переписать это вправо : http://mydomain.ovh/index.php?type=my&name=object

Я перехожу к http://mydomain.ovh/fill/my/object.html или http://mydomain.ovh/write/your/data.html

Перезапись вправо : http://mydomain.ovh/set.php?type=my&name=object or http://mydomain.ovh/set.php?type=your&name=data

Но когда я перехожу к http://mydomain.ovh/extract/my/object.html или http://mydomain.ovh/extract/your/data.html

Перезапись всегда неверна : запрос достигает сценария, но безСтрока запроса ... (и, кажется, это перенаправление?)

["PATH_TRANSLATED"]=>
string(19) "redirect:/index.php"
["PATH_INFO"]=>
string(30) "/my/object.html"
["SCRIPT_NAME"]=>
string(11) "/extract.php"
["REQUEST_URI"]=>
string(37) "/extract/my/object.html"
["QUERY_STRING"]=>
string(0) ""
["PHP_SELF"]=>
string(41) "/extract.php/my/object.html"

Может ли кто-нибудь помочь с этими правилами перезаписи?

1 Ответ

1 голос
/ 07 октября 2019

Вам необходимо отключить параметр MultiViews в верхней части вашего .htaccess, который, по-видимому, включен для вашего веб-сайта в конфигурации Apache.

Добавьте это в верхней части вашего .htaccess:

Options -MultiViews

Опция MultiViews (см. http://httpd.apache.org/docs/2.4/content-negotiation.html) используется Apache's content negotiation module, который запускает до mod_rewrite и заставляет сервер Apache сопоставлять расширения файлов. Так что если /fileзатем URL Apache будет обслуживать /file.html.

После внесения этого изменения протестируйте новый браузер, чтобы избежать кеширования старого браузера.

...