Тщеславные URL-адреса с .htaccess

Мне нужно реализовать тщеславные URL-адреса, и это мой файл .htaccess

# check if mod_rewrite is present
<IfModule mod_rewrite.c>

  #turns it on
  RewriteEngine on

  #if the requested url isn't a file or a dir
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d

  #if the request does not end with .gif, .png or .jpg
  RewriteCond %{REQUEST_URI} !(\.gif|\.jpg|\.png)$ [NC]

  #process book.php, no matter what was in the url
  RewriteRule ^(.*)$ /book.php?book_id=$1 [L,QSA]

</IfModule>

Этот перевод работает правильно.

www.mydomain.com/foo -> www.mydomain.com/book.php?book_id=foo

Теперь мне нужно более конкретное условие:

www.mydomain.com/foo/readers -> www.mydomain.com/book.php?book_id=foo&readers=1

Хотя readers не меняется, foo — это случайная строка, и я хотел бы проверить этот конкретный URL-адрес.

www.mydomain.com/foo/readers -> valid
www.mydomain.com/foo/readers?q=hello -> valid
www.mydomain.com/foo/reader -> invalid
www.mydomain.com/foo/readers/bar -> invalid
www.mydomain.com/foo/bar/readers -> invalid

#I tried many solutions like this but i can't get the desired result
RewriteRule ^(.*)[/]readers /book.php?book_id=$1&readers=1 [L,QSA]

person lubilis    schedule 18.09.2017    source источник


Ответы (1)


Вам нужно использовать привязку в своем правиле и сделать косую черту необязательной:

RewriteRule ^([^/]+)/readers/?$ /book.php?book_id=$1&readers=1 [L,QSA,NC]
person anubhava    schedule 18.09.2017
comment
Это идеально. Спасибо - person lubilis; 18.09.2017
comment
Привет, у меня возникла проблема при попытке изменить хеш этого URL-адреса нажатием кнопки: www.mydomain.com/foo/readers -> window.location.hash = '#something'; Я не могу понять, почему www.mydomain.com/foo/readers/#something или www.mydomain.com/foo/readers#something перенаправляются. - person lubilis; 02.10.2017
comment
Я на мобильном, так как я путешествую в течение следующих нескольких дней. С какой именно проблемой вы сталкиваетесь после выполнения этого JS-кода? Инициирует ли он запрос к веб-серверу или нет? - person anubhava; 03.10.2017
comment
Да, он перенаправляет на www.mydomain.com/foo. Но это странно, если я пишу window.location.hash = '#something'; в Chrome, консоль работает хорошо, если я использую jquery для реализации нажатия кнопки, это работает хорошо (поэтому я решил, но не понял). Проблема в том, что когда я использую href="javascript:myMethod();", это не работает. (myMethod(window.location.hash = '#something';)) - person lubilis; 03.10.2017
comment
Я считаю, что это потому, что часть после # обрабатывается в самом JS и не передается Apache. - person anubhava; 03.10.2017