Использование mod_rewrite, чтобы скрыть фактические URL - PullRequest
0 голосов
/ 05 марта 2012

У меня есть сайт php, и я использую mod_rewrite для перенаправления всех запросов URL. Предположим, у меня есть скрипт product.php и у меня есть правило для него:

RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L,NC]
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L,NC]

Пока что это прекрасно работает, и когда пользователь набирает: http://www.mysite.com/product/1 ему будет показана страница с фактическим URL-адресом http:/www.mysite.com/product.php?pid=1.

Однако я хочу заставить пользователя получить доступ к моему сайту исключительно из правил, которые я предоставил. Под этим я подразумеваю, когда пользователь вводит http:/www.mysite.com/something или даже какой-то правильный URL-адрес, такой как http:/www.mysite.com/product.php?pid=1, он должен быть перенаправлен на страницу ошибки 404. Это может быть пользовательский скрипт или страница 404 по умолчанию для Apache.

Это возможно?

РЕДАКТИРОВАТЬ: В соответствии с просьбой, я публикую весь мой файл .htaccess:

Options +FollowSymLinks
Options +Indexes

RewriteEngine on    
RewriteBase /websitename
RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L,NC] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L,NC] 

1 Ответ

1 голос
/ 05 марта 2012

Вы можете просто добавить catch all как последний возможный текст и сопоставить его с 404.php (или чем угодно).

RewriteRule ^(.*)$ 404.php?attempt=$1 [L,NC]

Просто поместите это в конец ваших переписываний.

РЕДАКТИРОВАТЬ:

Я проверил это сам (я обычно не использую переписывает таким образом):

RewriteEngine on    

RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L]

RewriteRule ^(.*)$ 404.php?attempt=$1 [L]

И также обнаружил, что404 будет поражен каждый раз.Видимо, это ожидаемое поведение .htaccess.(https://stackoverflow.com/a/3642271/603184)

Получается, что вам нужно прекратить сопоставление при попадании в файл product / category.php, это можно сделать, добавив:

RewriteRule ^category.php$ - [L]
RewriteRule ^product.php$ - [L]

Перед перенаправлением 404. Результатв:

RewriteEngine on    

RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L]

RewriteRule ^category.php$ - [L]
RewriteRule ^product.php$ - [L]

RewriteRule ^(.*)$ 404.php?attempt=$1 [L]
...