2010-06-13 67 views
10

Tôi đang gặp khó khăn với .htaccess. Tôi muốn tạo URL thân thiện cho một trang web tôi đang làm việc trên ...Làm cách nào để tạo URL thân thiện với .htaccess?

Về cơ bản tôi muốn chuyển đổi này:

http://website.com/index.php?ctrl=pelicula&id=0221889 
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters 

Into này:

http://website.com/pelicula/0221889/ 
http://website.com/pelicula/0221889/posters/ 

Trong trường hợp tôi cần nó sau này tôi cũng muốn biết cách thêm tiêu đề bài viết vào cuối URL như thế này (Tôi đang sử dụng PHP):

http://website.com/pelicula/0221889/the-article-name/ 
http://website.com/pelicula/0221889/the-article-name/posters/ 

Không e: Phương pháp Stackoverflow cũng tốt cho tôi, ví dụ url của câu hỏi này là:

http://stackoverflow.com/questions/3033407/htacces-to-create-friendly-urls-help-needed 

Nhưng bạn có thể đặt bất kỳ thứ gì sau id và nó cũng sẽ hoạt động. như thế này:

http://stackoverflow.com/questions/3033407/just-anything-i-want 

Tôi đã sử dụng một số công cụ web tự động để tạo tệp .htacces nhưng không hoạt động chính xác. Vì vậy, tôi yêu cầu sự giúp đỡ của bạn.

tôi cũng sẽ vui mừng nếu bạn có thể giới thiệu .htacces thực hành tốt nhất và khuyến nghị ..

EDIT: dựa trên số câu trả lời tôi nhận được ở đây tôi đặt này:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] 
</IfModule> 

Nhưng tôi nhận được lỗi máy chủ lưu trữ mặc định 'không tìm thấy'.

Tôi cũng đã cố gắng:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^([^/]+)/(\d+)/([^/]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] 
    RewriteRule ^([^/]+)/(\d+)/?$   index.php?ctrl=$1&id=$2 [QSA,L] 
    RewriteRule ^([^/]+)/?$    index.php?ctrl=$1 [QSA,L] 
</IfModule> 

này cũng không hoạt động. Nó đưa tôi đến trang 404.php mặc định của tôi.

mod_rewrite được bật và hoạt động.

Trợ giúp!

+0

http://stackoverflow.com/questions/2569725/getting-two-variables-in-the-url-with-htaccess/2569734#2569734 http://stackoverflow.com/questions/2088804/htaccess- nhầm lẫn-làm sạch-url/2088854 # 2088854 http://stackoverflow.com/questions/2549408/needs-some-help-with-an-apache-mod-rewrite-issue/2549688#2549688 ... –

+1

Để xem nội dung của bạn Các URL đang được viết lại, thử lặp lại $ _GET ở đầu index.php hoặc sử dụng nhật ký viết lại để gỡ lỗi. http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog – cam8001

+0

Bạn có thực sự chắc chắn rằng việc viết lại đang hoạt động đúng không? Tôi đã có cùng một vấn đề một lần với cấu hình cấu hình apache cấu hình xấu. http://www.webune.com/forums/how-to-test-check-if-mod-rewrite-is-enabled-t40.html thực sự đã giúp tôi – DrColossos

Trả lời

6

Trong các tài liệu gốc cho http://website.com/ tôi muốn đặt một tập tin htaccess như thế này:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
</IfModule> 

Sau đó, trong kịch bản PHP của bạn, bạn có thể thao tác biến $_GET['url'] như bạn xin vui lòng:

$path_components = explode('/', $_GET['url']); 
$ctrl=$path_components[0]; 
$id=$path_components[1]; 
$tab=$path_components[2]; 
+0

Tôi cần thay đổi tất cả ứng dụng web để sử dụng? Ý tôi là, tôi cần phải thay đổi tất cả $ _GET trong mỗi trang? – Jonathan

+1

@ Jonathan: Không, đó là toàn bộ vấn đề! Bạn sẽ chỉ có mã đó trong trang index.php. Sau đó index.php có thể quyết định phải làm gì và 'include' (các) trang cần thiết tùy thuộc vào biến $ _GET – nico

+0

Điều này được gọi là Mẫu điều khiển mặt trước và là IMHO theo cách để đi. –

0

Người đầu tiên giả định tập tin .htaccess của bạn là trong thư mục gốc:

RewriteRule ^([a-zA-Z]+)/([0-9]+)(/)?$ index.php?ctrl=$1&id=$2 

Thứ hai:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)(/)?$ index.php?ctrl=$1&id=$2&tab=$3 

hoặc nếu nó luôn luôn posters chứ không phải là các tab khác nhau:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/posters(/)?$ index.php?ctrl=$1&id=$2&tab=posters 

Tôi đã thêm (/)? điều này có nghĩa là URI sẽ hoạt động với hoặc withou t dấu gạch chéo.

Đối với người khác, tôi có thể luôn luôn giữ bài viết ở cuối để viết lại hoặc thêm /value khác để viết lại biết sự khác biệt giữa tab và bài viết hoặc loại trừ dấu gạch ngang từ regex.

+0

tuyệt vời, đây là dòng duy nhất tôi cần phải đặt bên trong htacces tập tin? – Jonathan

0

Để có url này:

http://website.com/pelicula/0221889/posters 

được viết lại cho điều này:

http://website.com/index.php?ctrl=pelicula&id=0221889&tab=posters 

tôi sẽ làm điều này:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] 
</IfModule> 

Bạn phải chọn nếu bạn muốn đặt tiêu đề sau id và làm điều đó tất cả các thời gian, vì con người biến tab ở vị trí cuối cùng: bạn phải biết nếu nó sẽ là số 3 hoặc số 4. Nếu bạn làm điều này:

RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)$ index.php?ctrl=$1&id=$2&tab=$4 [QSA,L] 

ngoặc thứ ba là không bị bắt, và do đó có thể chứa bất cứ điều gì.

Hy vọng rằng sẽ giúp

+0

Tôi đặt tệp này vào tệp .htacces nhưng không hoạt động, bất kỳ ý tưởng nào tại sao? – Jonathan

+0

Vâng, bạn sẽ nhận được vua sao băng? Bạn đã bật mod_rewrite chưa? – jfoucher

+0

có, mọi thứ đều được bật. Nó chỉ không tìm thấy trang .. – Jonathan

7

Chỉ cần thử nghiệm này tại địa phương và có vẻ như để làm những gì bạn cần:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^([^/.]+)(?:/)?$ /index.php?ctrl=$1 [L] 
    RewriteRule ^([^/.]+)/([^/.]+)(?:/)?$ /index.php?ctrl=$1&id=$2 [L] 
    RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)(?:/.*)?$ /index.php?ctrl=$1&id=$2&tab=$3 [L] 
</IfModule> 

Đây là những gì nó làm:

Những viết lại sẽ làm việc có hoặc không có một dấu gạch chéo - nếu bạn muốn họ làm việc chỉ mà không dấu gạch chéo, loại bỏ các (?:/)? từ ngày kết thúc của hai viết lại đầu tiên. Bạn cũng có thể sử dụng mod_rewrite để thêm hoặc xóa dấu gạch chéo theo yêu cầu.

+0

Nó không hoạt động trên máy chủ web của tôi. Tôi nhận được lỗi này: Lỗi Máy chủ Nội bộ. Máy chủ đã gặp lỗi nội bộ hoặc cấu hình sai và không thể hoàn thành yêu cầu của bạn. Bất kỳ ý tưởng nào? – Jonathan

+0

Thử xóa dấu gạch chéo ở phía trước index.php trên tất cả các quy tắc viết lại. – cam8001

+0

Tôi đã xóa các dấu gạch chéo, cùng một lỗi.Tôi nghĩ rằng nó có thể là một lỗi cú pháp bởi vì khi tôi thử mã được cung cấp bởi 'jfoucher' tôi không gặp vấn đề này ... – Jonathan

0

Đảm bảo bạn không có bất kỳ tệp .htaccess nào khác trên cây thư mục xung đột với .htaccess của trang web của bạn.

0

tôi sử dụng này trong .htaccess tập tin của tôi

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* rewrite.php [L] 

Về cơ bản nếu nó không tồn tại như một tập tin hoặc một thư mục, sử dụng rewrite.php và để cho rằng chăm sóc URL phân tích cú pháp vv Đó là tôi tin rằng cách cơ bản nhất bạn có thể viết lại.

Ngoài ra, kiểm tra kết quả của var_dump($_SERVER) (ở đâu đó bạn biết công trình) để xem những gì bạn nghĩ là thư mục trên cùng thực sự là thư mục trên cùng, ví dụ: bạn có thể writiting để /var/www/domain/www/index.php thay vì /var/www/domain/index.php

0

Dựa về kinh nghiệm, tôi khuyên bạn nên điều chỉnh lược đồ URI của bạn để dễ dàng hơn khi chỉ áp dụng quy tắc cho URI mà bạn BIẾT được viết lại. Ví dụ

Chuyển đổi này:

http://website.com/index.php?ctrl=pelicula&id=0221889 
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters 

Into này (tôi đã đặt chữ "công cụ", nhưng điều này thực sự nên là cái gì đó mô tả những gì bạn có khả năng tìm thấy, tức là "cửa hàng" hoặc " thư viện" hoặc bất cứ nội dung này):

http://website.com/stuff/pelicula/0221889/ 
http://website.com/stuff/pelicula/0221889/posters/ 

Để đạt được điều này, bạn sẽ đặt một tập tin .htaccess trong thư mục cấp cao nhất của trang web của bạn có chứa các quy tắc sau:

RewriteEngine on 
RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L,NC,QSA] 
RewriteRule ^stuff/([^/\.]+)/([^/\.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA] 

Bằng cách có phần "nội dung" của địa chỉ (được đổi tên thành địa chỉ thích hợp), bạn sẽ không vô tình viết lại các nội dung khác như hình ảnh, bao gồm CSS và JavaScript bao gồm.

Là một mặt lưu ý, bạn đã đề cập:

This also does not work. It takes me to my default 404.php page.

đâu chuyển hướng lỗi 404 bạn tuyên bố?

0

RewriteRule^stuff /([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 & tab = $ 3 [L, NC, QSA] RewriteRule^stuff /([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 [L, NC, QSA]

Các vấn đề liên quan